簡體   English   中英

通過主線程控制工作線程的工作

[英]Controlling the work of worker threads via the main thread

嘿,我不確定是否已經這樣詢問過。 (至少我沒有找到這個具體問題的答案)。 但:

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

用戶可以在此窗口中輸入必須由服務器驗證的數據。 因為窗口仍將響應用戶的操作,所以它(僅是UI線程)不應在其自己的線程中處理傳輸和評估。 我希望UI線程將這項工作委派回主線程。

另外:主線程(我的“客戶端”線程)應管理所有正在進行的操作,例如登錄,處理從服務器接收到的消息等(不是窗口消息)。

但是我不確定如何執行此操作:1.)我是否應該讓UI-Thread將APC排隊到主線程(但是主線程不知道發生了什么事情。2.)我可以更好地使用等待事件對象並排隊將數據從一個線程傳輸到另一個線程?...

還是有更好的選擇?

例如:我啟動客戶端:1.客戶端從文件加載數據並進行一些初始化

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

  2. 窗口線程應通知並處理用戶輸入的,直到客戶端。

  3. 客戶端現在將打包數據並將發送工作委托給另一個對象(例如CSingleConnection),該對象處理通過網絡發送數據(當然,這不需要新線程,因為可以使用重疊I / O進行處理)。 。

  4. 一個特殊的接收器線程從服務器接收數據並將其處理回客戶端,客戶端依次對數據求值。

  5. 如果數據正確並且從服務器接收到一些特殊的東西,則主線程應向UI線程發出信號以關閉窗口並終止...

  6. 然后,客戶端創建一個新窗口,該窗口將處理聊天UI

  7. 聊天UI線程和客戶端線程應進行通信以處理要發送和接收的消息...

(希望這有助於獲得我正在嘗試的東西)...

這完全取決於您准備使用什么。 如果您使用Qt進行開發,那么它們的信號和插槽就是進行此類通信的方法。 它們還提供了一個網絡庫,因此您可以輕松地省略接收器線程,因為它們的網絡類執行異步通信,並在有數據時發送信號,這意味着您的線程在此期間不需要被阻塞。

如果您不想使用Qt,boost還會提供線程安全信號和插槽 ,但據我所知,它們的插槽將在調用線程的上下文中運行...

無論如何,我為此非常滿意地使用了Qt信號和插槽。 我完全同意,GUI永遠都不應凍結。

我不知道這是否是好的風格(回答您自己的問題):

但是我想我可以使用事件對象和兩個隊列(一個用於客戶端和連接之間的連接,另一個用於通信客戶端和UI)...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM