在win32中的线程中向主窗口发送消息
Posted
技术标签:
【中文标题】在win32中的线程中向主窗口发送消息【英文标题】:sending messages to the main window in a thread in win32 【发布时间】:2013-05-28 19:51:20 【问题描述】:我对在 Win32 api 中使用线程还比较陌生,遇到了一个我无法解决的问题。
这是我的问题,我有 4 个线程(它们按预期工作)允许操作员测试 4 个终端。在每个线程中,我都尝试通过 Pass 或 Fail 向主窗口窗体发送消息,这被放置在列表框中。下面是其中一个线程,其余完全一样。
void Thread1(PVOID pvoid)
for(int i=0;i<numberOfTests1;i++)
int ret;
double TimeOut = 60.0;
int Lng = 1;
test1[i].testNumber = getTestNumber(test1[i].testName);
unsigned char Param[255] = 0;
unsigned char Port1 = port1;
ret = PSB30_Open(Port1, 16);
ret = PSB30_SendOrder (Port1, test1[i].testNumber, &Param[0], &Lng, &TimeOut);
ret = PSB30_Close (Port1);
if(*Param == 1) SendDlgItemMessage(hWnd,IDT_RESULTLIST1,LB_ADDSTRING,i,(LPARAM)"PASS");
else SendDlgItemMessage(hWnd,IDT_RESULTLIST1,LB_ADDSTRING,i,(LPARAM)"FAIL");
_endthread();
我已经调试了代码,它完成了除了填充列表框之外的所有操作,我假设因为它是一个线程,所以我缺少一些东西,因为相同的代码与线程一起工作。在将消息发送到主窗口时,我是否需要让线程休眠?
感谢任何帮助。
干杯
【问题讨论】:
检查SendDlgItemMessage()
的返回值,确保它返回>= 0
表示成功,而不是LB_ERR
或LB_ERRSPACE
表示失败。
【参考方案1】:
您不希望辅助线程尝试直接操作您的 UI 元素(例如 SendDlgItemMessage
)。相反,您通常希望将 WM_COMMAND
或 WM_USER
+N 之类的内容发布到主窗口,并让其相应地操作 UI 元素。
【讨论】:
总的来说,从设计的角度来看,这是一个很好的建议。但是,使用SendMessage()
和相关函数从工作线程向主线程中的 UI 控件发送消息也是有效且安全的,因为在主线程将其消息队列泵入新消息之前,消息不会被分派到控件.这在SendMessage()
文档中有明确的概述。
@RemyLebeau:理论上它应该可以工作,是的。目前它没有(因此是问题)。既然他无论如何都需要做一些事情来让它发挥作用,为什么不把它做好呢?这并不是说真的需要大量额外的工作。
您好,感谢您的回复,SendDlgItemMessage() 返回 0,这很好,但列表框中仍然没有出现任何内容。 Jerry 关于不直接操作 UI 元素的说法让我有点困惑(我习惯于在主窗口过程中完成所有工作),谁能提供一个如何在代码中显示这一点的快速示例。谢谢以上是关于在win32中的线程中向主窗口发送消息的主要内容,如果未能解决你的问题,请参考以下文章