嘿,我不知道這是否已經被問過。 (至少我沒有找到關於這個具體問題的答案)。但是:通過主線程控制工作線程的工作
我有一個程序,它在啓動時在新的UI線程中創建一個登錄窗口。
在此窗口中,用戶可以輸入必須由服務器驗證的數據。因爲窗口仍然會響應用戶的動作,所以它(它只是一個UI線程)不應該在它自己的線程中處理傳輸和評估。 我想讓UI線程將這項工作委託給主線程。
另外:主線程(我的「客戶」線程)應管理該走的所有操作,如登錄,處理從服務器收到的消息等等(不窗口消息)
但我我不知道如何做到這一點: 1.)我應該讓UI線程將APC排隊到主線程(但主線程不知道正在發生的事情) 2.)我可以更好地使用事件對象被等待並排隊傳輸數據從一個線程到另一個?...
或者有沒有更好的選擇?
例如:我啓動客戶端:從文件 1.客戶端負載數據和做一些intialization
客戶端創建在一個新的線程一個窗口,它處理來自用戶的登錄數據輸入。
窗口線程應將已經由用戶輸入的信息通知給客戶端。
客戶端現在應打包數據並將發送工作委託給另一個處理通過網絡發送數據的對象(例如CSingleConnection)(當然,這不需要新線程,因爲它可以處理重疊I/O ...
一個特殊的接收器線程接收來自服務器的數據,並處理它返回給客戶端,其中 - 反過來 - 評估數據
如果數據是正確的,有些從服務器收到特殊的東西,主線程將發信號通知UI線程關閉窗口並終止...
客戶端然後創建一個新的窗口,它將處理聊天的UI
聊天UI線程和客戶端線程應將處理消息被髮送和接收...
(希望這有助於得到我想要的)...
讓「客戶端」線程處理消息毫無意義。如果客戶端線程阻塞,UI也會阻塞,因爲消息沒有被傳遞! – 2010-06-30 21:10:36
我不完全明白你的意思...... UI線程永遠不會阻塞,聊天窗口不會再無響應,因爲它有它自己的線程... 客戶端只管理傳入的消息在parsin之後被重定向到UI線程......它將等待多個事件/消息被接收到...... 或者你的意圖是什麼? – Incubbus 2010-06-30 21:20:57
應用程序被標記爲「不響應」的原因是該應用程序不再處理消息。如果您的客戶端線程阻塞並負責將消息傳遞到您的客戶端窗口,那麼客戶端窗口在其自己的線程上創建並不重要,它不處理消息。將消息與UI分開也會導致諸如「DefWindowProc」之類的問題,這些問題需要在觸發消息的同一個線程上處理,並且需要能夠更改UI。您不能跨線程更改UI。 – 2010-07-01 01:07:56