wxID_ANY, wxNewId()和用户给出的id
wxID_ANY, wxNewId() and IDs given by user
这是一个更一般的问题:
我注意到使用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_COORDINATES
和ID_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分配,但只使用一次,并将其返回的值分配给变量。
- C++如何通过用户输入删除列表元素
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何使用用户输入在C++中正确填充2D数组
- C++MySQL C api用户输入行
- 使用用户定义函数的字符串反转
- 用户定义函数中的指针和输入
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 如何只允许用户输入正整数
- C++如何计算用户输入的数字中的偶数位数
- 通过for循环使用用户输入填充列表
- 使用 C++ 和 cURL,如何通过需要用户 ID 和密码的 url 获取图像
- 使用 LDAP - 本机 API 中的页面控件获取活动目录组中的所有用户 ID
- 从.txt文件找到并验证C 的特定用户ID
- 使用 C 在 Linux 中设置用户的补充组 ID
- 需要调试"在')'令牌之前预期的非限定id",第一次使用c ++的用户
- QFile和QTextStream帮助(为具有用户名、密码和名称的用户编写ID)
- QVariant用户类型()id
- 仅使用一个用户id和密码访问数据库
- Windows登录的用户唯一ID
- wxID_ANY, wxNewId()和用户给出的id