wxID_ANY, wxNewId()和用户给出的id

wxID_ANY, wxNewId() and IDs given by user

本文关键字:用户 id ANY wxNewId wxID      更新时间:2023-10-16

这是一个更一般的问题:

我注意到使用wxWidgets中的ID函数的奇怪行为。我有一个创建事件的线程。起初,我为事件使用wxID_RETRY之类的通用id,但随着事件的增多,我不得不创建自己的id。所以我创建了一个头文件,id如下:

#ifndef DGPSGUIIDS_H_INCLUDED
#define DGPSGUIIDS_H_INCLUDED
/** brief ID for a RefreshCoordinates event*/
//@{
const int ID_REFRESH_COORDINATES = 1000;
//@}
/** brief ID for a RefreshDirection event*/
//@{
const int ID_REFRESH_DIRECTION = 1001;
//@}
const int ID_GNSS_CONNECTION = 1002;;
const int ID_VIBROTAC_CONNECTION = 1003;
#endif // DGPSGUIIDS_H_INCLUDED

都工作得很好,但我认为这不是给这些id自选数字的优雅方式。所以我用wxNewID()代替数字。突然间,我的所有线程都不能工作了,我很难弄清楚为什么。当我记得我更改了id后,我将其更改回数字,它再次工作(惊喜…)。但我仍然希望生成id。在搜索wxNewId()后,我看到它被弃用了,所以我尝试了提到的wxID_ANY。现在线程做了一些事情,但不是我期望它们做的。使用ID_REFRESH_COORDINATES的线程现在没有刷新坐标,而是首先将我设置的wxString作为使用ID_GNSS_CONNECTION的另一个事件的有效负载写入窗口,然后删除所有文本。(我只在ID_REFRESH_COORDINATESID_REFRESH_DIRECTION上使用wxID_ANY)(这是函数):

void WindowsDgpsGUIFrame::onRefreshCoordinates(wxThreadEvent& event)
{
    StaticCoordinatesText->SetLabel(event.GetString());
}

事件绑定:

WindowsDgpsGUIFrame::WindowsDgpsGUIFrame(wxWindow* parent,wxWindowID id)
{
    Bind(wxEVT_THREAD, &WindowsDgpsGUIFrame::onGnssConnection, this, ID_GNSS_CONNECTION);
    Bind(wxEVT_THREAD, &WindowsDgpsGUIFrame::onVibroTacConnection, this, ID_VIBROTAC_CONNECTION);
    Bind(wxEVT_THREAD, &WindowsDgpsGUIFrame::onRefreshDirections, this, ID_REFRESH_DIRECTION);
    Bind(wxEVT_THREAD, &WindowsDgpsGUIFrame::onRefreshCoordinates, this, ID_REFRESH_COORDINATES);
}

我是这样在线程中设置字符串的:

wxThreadEvent coordinatesEvent(wxEVT_THREAD, ID_REFRESH_COORDINATES);
coordinatesEvent.SetString(coordinatesString);
m_parent->GetEventHandler()->AddPendingEvent(coordinatesEvent);

我发现这一切都很奇怪,想知道为什么没有一个ID函数像我期望的那样工作…这不是一个真正的问题,只是一个有趣的行为我偶然发现。

在生成事件和绑定事件时需要使用相同的ID。所以你只能使用wxID_ANY,如果你根本不关心的id,即,如果你只是处理相同事件类型的所有事件(wxEVT_THREAD在你的情况下)以相同的方式。如果在绑定时使用ID,则必须在两个地方使用相同的值,这意味着要么使用常量,就像开始时那样,要么使用wxNewId()进行动态ID分配,但只使用一次,并将其返回的值分配给变量。