【问题标题】:How do you create a Message Box thread?如何创建消息框线程?
【发布时间】:2011-12-23 15:01:05
【问题描述】:

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

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

但是,这似乎不适用于我尝试执行的任务。 为消息框创建线程而不出现故障的最佳方法是什么?

【问题讨论】:

  • 您要执行的任务是什么?故障是什么意思?
  • 好吧,既然您发布的代码没有做您想要做的事情,我们应该如何从中推断出您的任务?我猜你是在寻找一个非模态对话框。
  • 我正在为我正在开发的python游戏制作一个调试程序,当你按下一个按钮时它会出现一个确认消息框,但是,如果你有超过九个消息框,你会崩溃,有些人可能不会退出消息框。因此,通过出现故障,我的意思是它实际上崩溃了。
  • 使用线程会使这个问题变得更糟。消息框将桌面作为其父级,因为在此线程上没有创建其他窗口。并任意消失在另一个窗口后面。

标签: c++ multithreading messagebox


【解决方案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

【讨论】:

  • 非常感谢,它解决了我的问题。感谢您提供额外的信息。
【解决方案2】:

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

一般来说,你不会。

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

如果您真正想要实现的是一个对话框或某种其他类型的窗口,它可以与其他正在运行的窗口同时运行,以便在其他窗口仍然响应用户输入时它可以保持运行,那么您需要一个无模式窗口或对话框。这是一个不会阻止其他窗口处理更新或接受用户输入的窗口。 See here 了解如何使用 MFC 实现此功能,但请注意,您无需使用 MFC 即可实现无模式对话框。

【讨论】:

    【解决方案3】:

    老问题,新答案……

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

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

    • 一位同事告诉我,我需要在使用 DLL 文件的测试可执行文件的末尾添加一个睡眠,以便它工作。

    果然,它修复了它。这也很有意义,尤其是在 DLL 的上下文中。大多数应用程序循环直到被指示退出;我的测试应用程序没有。

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

    【讨论】:

      猜你喜欢
      • 2014-01-14
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      • 2012-10-28
      • 2022-01-18
      • 2010-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多