2011-12-23 84 views
1

我试图做这样的事情......如何创建消息框线程?

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

然而,这似乎并没有为我想执行的任务正常工作。 为消息框创建线程的最佳方式是什么,而不会让它毛刺?

+1

什么是你想表演,你是什么意思任务小故障了吗? – DrYap 2011-12-23 15:13:31

+0

好吧,既然你发布的代码不会做你想做的事情,我们应该如何从它推断出你的任务?我想你是在一个非模态对话框之后。 – 2011-12-23 15:15:23

+0

我正在为我正在开发的python游戏制作一个调试程序,并且当您按下按钮时会出现一个确认消息框,但是,如果您有超过九个消息框,则会崩溃,并且有些人可能无法退出消息框。所以通过小问题,我的意思是它实际上是崩溃。 – GreenMyth 2011-12-23 15:16:20

回答

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

+0

非常感谢,它解决了我的问题。并感谢您的额外信息。 – GreenMyth 2011-12-23 15:24:40

0

什么是最好的方式来创建一个消息框的线程,而没有它毛刺?

一般来说,你不知道。

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

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