2010-06-30 159 views
0

嘿,我不知道這是否已經被問過。 (至少我沒有找到關於這個具體問題的答案)。但是:通過主線程控制工作線程的工作

我有一個程序,它在啓動時在新的UI線程中創建一個登錄窗口。

在此窗口中,用戶可以輸入必須由服務器驗證的數據。因爲窗口仍然會響應用戶的動作,所以它(它只是一個UI線程)不應該在它自己的線程中處理傳輸和評估。 我想讓UI線程將這項工作委託給主線程。

另外:主線程(我的「客戶」線程)應管理該走的所有操作,如登錄,處理從服務器收到的消息等等(不窗口消息)

但我我不知道如何做到這一點: 1.)我應該讓UI線程將APC排隊到主線程(但主線程不知道正在發生的事情) 2.)我可以更好地使用事件對象被等待並排隊傳輸數據從一個線程到另一個?...

或者有沒有更好的選擇?

例如:我啓動客戶端:從文件 1.客戶端負載數據和做一些intialization

  • 客戶端創建在一個新的線程一個窗口,它處理來自用戶的登錄數據輸入。

  • 窗口線程應將已經由用戶輸入的信息通知給客戶端。

  • 客戶端現在應打包數據並將發送工作委託給另一個處理通過網絡發送數據的對象(例如CSingleConnection)(當然,這不需要新線程,因爲它可以處理重疊I/O ...

  • 一個特殊的接收器線程接收來自服務器的數據,並處理它返回給客戶端,其中 - 反過來 - 評估數據

  • 如果數據是正確的,有些從服務器收到特殊的東西,主線程將發信號通知UI線程關閉窗口並終止...

  • 客戶端然後創建一個新的窗口,它將處理聊天的UI

  • 聊天UI線程和客戶端線程應將處理消息被髮送和接收...

  • (希望這有助於得到我想要的)...

    +0

    讓「客戶端」線程處理消息毫無意義。如果客戶端線程阻塞,UI也會阻塞,因爲消息沒有被傳遞! – 2010-06-30 21:10:36

    +0

    我不完全明白你的意思...... UI線程永遠不會阻塞,聊天窗口不會再無響應,因爲它有它自己的線程... 客戶端只管理傳入的消息在parsin之後被重定向到UI線程......它將等待多個事件/消息被接收到...... 或者你的意圖是什麼? – Incubbus 2010-06-30 21:20:57

    +0

    應用程序被標記爲「不響應」的原因是該應用程序不再處理消息。如果您的客戶端線程阻塞並負責將消息傳遞到您的客戶端窗口,那麼客戶端窗口在其自己的線程上創建並不重要,它不處理消息。將消息與UI分開也會導致諸如「DefWindowProc」之類的問題,這些問題需要在觸發消息的同一個線程上處理,並且需要能夠更改UI。您不能跨線程更改UI。 – 2010-07-01 01:07:56

    回答

    0

    我不知道閹這是好作風與否(anwsering你自己的問題):

    但我覺得我跟事件對象和兩個隊列(一個用於客戶端和連接之間的連接,以及一個溝通客戶端和用戶界面)...

    0

    這一切都取決於你準備使用什麼。如果你正在用Qt開發,他們的信號和插槽就是做這種通信的東西。他們還提供網絡庫,因此您可以輕鬆省略接收者線程,因爲他們的network classes會進行異步通信,並在您有數據時發送信號,這意味着您的線程無需同時被阻止。

    如果你不想使用Qt,升壓還提供thread safe signals and slots,但據我瞭解他們的插槽將在調用線程的上下文不管怎麼說運行...

    ,我已經使用Qt簽名和插槽非常滿意,正是爲了這個目的。我完全同意GUI不應該凍結,永遠。

    +0

    我不想使用任何外部庫...我只想使用通常的C++東西和Win32 API來完成此操作... – Incubbus 2010-07-01 13:19:19