你如何创建一个消息框线程?

时间:2011-12-23 15:01:05

标签: c++ multithreading messagebox

我尝试过像......这样的事情。

const char *MessageBoxText = "";

DWORD WINAPI CreateMessageBox(LPVOID lpParam){

    MessageBox(NULL, MessageBoxText, "", MB_OK|MB_APPLMODAL);
    return TRUE;

}

MessageBoxText = "Blah, Blah, Blah...";
CreateThread(NULL, 0, &CreateMessageBox, NULL, 0, NULL);

但是,对于我尝试执行的任务,这似乎无法正常工作。 为消息框创建线程的最佳方法是什么,而不会让它出现故障?

3 个答案:

答案 0 :(得分:1)

考虑将消息文本作为线程参数而不是全局变量传递,以使代码成为线程安全的。

DWORD WINAPI CreateMessageBox(LPVOID lpParam) {
    MessageBoxA(NULL, (char*)lpParam, "", MB_OK);
    return 0;
}
CreateThread(NULL, 0, &CreateMessageBox, "Blah, Blah, Blah...", 0, NULL);

此外,您无需指定MB_APPLMODAL作为默认标志(等于0)。

如果您定位的是现代Windows操作系统,最好定义UNICODE,因为MessageBoxA会将字符串转换为UTF-16并调用MessageBoxW

答案 1 :(得分:0)

  

为消息框创建线程的最佳方法是什么,而不会让它出现故障?

一般情况下,你没有。

在Windows下,应用程序中的所有窗口(小'w',这里表示各个GUI元素)在单个线程中“运行”。这通常是“主”线程 - 但特别是,它是message pump正在运行的线程。有关消息泵的详细信息,请参阅我的链接帖子。

如果您真正想要实现的是一个对话框或其他类型的窗口可以同时运行到其他运行的窗口,以便它可以保持正常,而其他窗口仍然响应用户输入,那么你想要一个无模式窗口或对话框。这是一个窗口,不会阻止其他窗口处理更新或接受用户输入。 See here有关如何使用MFC实现此操作的说明,但请注意,您不需要使用MFC来实现无模式对话框。

答案 2 :(得分:0)

旧问题,新答案...

如果正在调用的线程被立即退出的进程所存在(例如,您正在运行使用VC ++ DLL并弹出消息框的可执行文件),则该线程将永远没有执行的机会。 / p>

我创建了一个用于测试的VC ++可执行文件,该文件在我的DLL上运行了一个负载库,并且该DLL创建了带有调试消息框的各种线程。由于我的测试可执行文件只调用了DLL,然后退出了,因此无法正常工作。

  • 我的一位同事通知我,我需要在使用DLL文件的测试可执行文件的末尾添加一个睡眠,以使其正常工作。

果然解决了。这也很有意义,尤其是在DLL的上下文中。大多数应用程序都会循环运行,直到指示退出为止。我的测试应用程序没有。

请注意您的应用程序的行为方式!