2011-12-23 85 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即可實現無模式對話框。