在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()的返回值,确保它返回&gt;= 0表示成功,而不是LB_ERRLB_ERRSPACE表示失败。 【参考方案1】:

您不希望辅助线程尝试直接操作您的 UI 元素(例如 SendDlgItemMessage)。相反,您通常希望将 WM_COMMANDWM_USER+N 之类的内容发布到主窗口,并让其相应地操作 UI 元素。

【讨论】:

总的来说,从设计的角度来看,这是一个很好的建议。但是,使用 SendMessage() 和相关函数从工作线程向主线程中的 UI 控件发送消息也是有效且安全的,因为在主线程将其消息队列泵入新消息之前,消息不会被分派到控件.这在SendMessage() 文档中有明确的概述。 @RemyLebeau:理论上它应该可以工作,是的。目前它没有(因此是问题)。既然他无论如何都需要做一些事情来让它发挥作用,为什么不把它做好呢?这并不是说真的需要大量额外的工作。 您好,感谢您的回复,SendDlgItemMessage() 返回 0,这很好,但列表框中仍然没有出现任何内容。 Jerry 关于不直接操作 UI 元素的说法让我有点困惑(我习惯于在主窗口过程中完成所有工作),谁能提供一个如何在代码中显示这一点的快速示例。谢谢

以上是关于在win32中的线程中向主窗口发送消息的主要内容,如果未能解决你的问题,请参考以下文章

主线程怎么给子线程发送消息

在 Electron 中向父窗口发送消息

请教一个利用pywin32向特定窗口发送键盘消息的问题

python win32api win32gui win32con 窗口句柄 发送消息 常用方法 键盘输入

主线程与子线程之间相互通信(HandlerThread)

c# 调用 win32 API的 SendMessage 函数 ,里面的属性用法?