您如何创建消息框线程?

问题描述 投票:1回答:3

我曾尝试做类似...的事情

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);

但是,对于我要执行的任务,这似乎无法正常工作。在没有故障的情况下为消息框创建线程的最佳方法是什么?

c++ multithreading messagebox
3个回答
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 OS,最好定义UNICODE,因为MessageBoxA会将您的字符串转换为UTF-16并调用MessageBoxW


0
投票

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

通常来说,您不知道。

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

如果您真正要实现的是一个对话框或某种其他类型的窗口,可以与其他正在运行的窗口同时运行,以便在其他窗口仍对用户输入作出响应的同时将其保持打开状态,那么您需要< [无模式窗口或对话框。这是一个不会阻止其他窗口处理更新或接受用户输入的窗口。 See here提供有关如何使用MFC实现此功能的说明,但请注意,无需使用MFC即可实现无模式对话框。


0
投票
旧问题,新答案...

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

我已经创建了用于测试的VC ++可执行文件,并在我的DLL上运行了一个负载库,并且该DLL创建了带有调试消息框的各种线程。由于我的测试可执行文件仅调用了DLL,然后退出了,所以它不起作用。

    我得到一位同事的通知,我需要在使用DLL文件的测试可执行文件的末尾添加一个睡眠,以使其正常工作。
  • 当然,它已修复。这也很有意义,尤其是在DLL的上下文中。大多数应用程序都会循环运行,直到指示退出为止。我的测试应用程序没有。

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

  • © www.soinside.com 2019 - 2024. All rights reserved.