2011-07-04 55 views
1

我剛開始學習C++。我用Visual Studio 2010完成了很多控制檯程序,現在我想製作win32程序。我閱讀了很多教程,現在我瞭解基礎知識。「互動」在C++中睡眠

我做了一個調用另一個函數的按鈕。這個函數做的很好,一切正常。但是在這個函數中有Sleep(x),並且GUI在休眠沒有結束時沒有響應。該功能在60秒內完成,因爲其中有很多睡眠,但它是做所有事情應該做的GUI這次沒有響應。

我想我知道這個問題的根源。在我看來,問題是睡眠完全暫停應用程序(Windows說:沒有響應)。

如何製作不凍結GUI的睡眠/暫停?有沒有功能,或者我必須以完全不同的方式做到這一點?

預先感謝您!

+0

睡眠呼叫真的需要嗎?你的功能是否真的需要「**在特定時間內不做任何事情」?如果是這樣,請告訴我們爲什麼。這一定會幫助你得到更好的答案。 –

+0

爲什麼你經常「睡覺」? – Xeo

+3

如果函數定期執行某些操作,請考慮使用WM_TIMER消息。 –

回答

4

在我看來,問題是睡眠完全暫停應用

是。

如何進行不凍結GUI的睡眠/暫停?

爲什麼你需要首先睡覺?如果該函數行爲不當,則可以始終在後臺線程中運行它(但請注意,這會增加相當多的複雜性和難度)。通常情況下,你根本不需要睡覺。如果你必須睡覺,那麼使它成爲一個循環,直到有足夠的時間通過,處理來自操作系統的事件並調用產生時間片的Sleep(0)

+0

由於OP是Win32的新功能,值得一提的是'Sleep'不會暫停應用程序,而是它被調用的線程。在上述情況下,它實際上是相同的,但如果需要您的建議並使用另一個線程,則只有一個將被「睡眠」暫停。 – eran

+0

@eran:我自己有點困,所以隨意編輯和澄清。 –

+0

我明白了。所以我所要做的就是在後臺線程中運行這些代碼,而主線程(GUI)可以工作並且後臺可以休眠。或者我理解它不好? 但是,這是困難的,但我目前正在尋找最簡單的方法來做到這一點。 – Gaboros

0

將作業卸載到單獨的線程(請參閱CreateThread)或使用PeekMessage et。在一個緊密的循環中處理窗口消息並保持GUI活着。

當然,你應該問自己,你是否真的需要睡覺。正如你所說的,主線程(輪詢消息泵的線程)的睡眠可以防止任何GUI處理。

0

你必須使用線程。請記住,如果在GUI中有一個長時間運行的進程,則必須創建一個線程並讓它處理所有代碼 - 在這種情況下,它包含許多睡眠指令。線程完成工作後,會通知您,然後您可以從中提取數據。