我曾尝试做类似...的事情
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);
但是,对于我要执行的任务,这似乎无法正常工作。在没有故障的情况下为消息框创建线程的最佳方法是什么?
考虑将消息文本作为线程参数而不是全局变量传递,以使代码成为线程安全的。
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 OS,最好定义UNICODE
,因为MessageBoxA
会将您的字符串转换为UTF-16并调用MessageBoxW
为消息框创建线程而不出现故障的最佳方法是什么?
通常来说,您不知道。
在Windows下,应用程序中的所有窗口(小'w',在这里表示单个GUI元素)在单个线程中“运行”。通常,这是“主”线程-但特别是,它是message pump在其中运行的线程。请参阅我的链接文章以获取有关消息泵的更多详细信息。
如果您真正要实现的是一个对话框或某种其他类型的窗口,可以与其他正在运行的窗口同时运行,以便在其他窗口仍对用户输入作出响应的同时将其保持打开状态,那么您需要< [无模式窗口或对话框。这是一个不会阻止其他窗口处理更新或接受用户输入的窗口。 See here提供有关如何使用MFC实现此功能的说明,但请注意,无需使用MFC即可实现无模式对话框。
如果正在调用的线程被立即退出的进程所存在(例如,您正在运行使用VC ++ DLL并弹出消息框的可执行文件,那么该线程将永远没有执行的机会。
我已经创建了用于测试的VC ++可执行文件,并在我的DLL上运行了一个负载库,并且该DLL创建了带有调试消息框的各种线程。由于我的测试可执行文件仅调用了DLL,然后退出了,所以它不起作用。
请注意您的应用程序的行为!