輔助線程如何和主線程通話

2022-04-21 16:19:19 字數 997 閱讀 7690

2013-07-04

在輔助線程的迴圈裡檢查乙個全域性變數很有意義,那麼如果主線程這樣做會怎麼樣呢?當然應該杜絕那麼比較笨重的函式;

uint computerthreadproc(lpvoid pparam)

g_ncount = 0;

while(g_ncount < 100){

//do some computation here

::interlockedincrement((long*)&g_ncount);

return 0;

其實我們並不想讓主線程進入乙個迴圈,因為那樣會浪費cpu週期,而且主線程總是有乙個訊息迴圈。這就是說,主線程有乙個視窗(可見或不可見),而輔助線程有乙個相應的視窗控制代碼。

我們是傳送send訊息還是寄出post訊息呢?最好是寄出訊息的方法。因為傳送訊息會引起主線程的mfc訊息**的重入,而這種模式的對話方塊就會出現問題。我們可以寄出什麼樣的訊息呢?任何使用者自定義的訊息都可以。

有關執行緒阻塞的問題:

比如當我們呼叫win32的sleep函式,使執行緒睡眠。等很多函式阻塞執行緒,特別是訪問硬體裝置或internet主機的函式。如果在win16方式下,這些函式會占用整個cpu直到他們完成為止;而在win32下,他們允許其他的程序和執行緒繼續執行。

在主使用者介面裡,我們要避免進行阻塞呼叫。記住,如果主線程阻塞,它就不能處理訊息,這樣會使程式顯得很遲緩。如果我們有乙個任務要求大量的檔案io,就應該吧相關的**放在輔助線程裡,然後在主線程裡同步執行緒。

在輔助線程裡,也要小心呼叫那些有可能被阻塞的函式。如果乙個執行緒被永遠阻塞了,那麼只有當主線程退出時執行緒才會被終止,但是這樣可能會有記憶體洩露。我們可以在主線程裡呼叫win32的函式terminatethread,但仍然有記憶體洩露。

有關使用者介面執行緒(ui執行緒)

mfc庫提供了ui執行緒很好的支援,我們可以從cwinthread派生乙個類,並使用afxbeginthread的乙個重要版本來啟動執行緒。cwintread的派生類有自己的initinstance函式,最重要的有自己的訊息迴圈。

主線程和子執行緒

子執行緒通過 handlerthread的thread.getlooper 繫結,在主線程的handler的handlermessage中呼叫threadhandler.sendmessagedelay msg,1000 向子執行緒傳送訊息。在子執行緒中通過handler.sendmessagede...

主線程和子執行緒

主線程負責管理由它建立的子執行緒,建立 啟動 掛起 停止等。主線程通過發訊息的方式管理子執行緒,例如,給子執行緒傳送start 訊息,子執行緒啟動,子執行緒執行入口的run 方法。thread有下面兩個構造方法 thread runnable target,string name thread ru...

主線程和子執行緒總結

執行結果 從上面可以看到 如果主線程和子執行緒是並行的,雖然都是用while 1 但是倚靠 cpu的排程,主線程和子執行緒都有機會得到執行。如果要在子執行緒裡面改變主線程裡面的資料,就在 pthread create 裡面的最後 乙個引數使用傳位址呼叫 void c,否則使用傳值呼叫 void c ...