C 子執行緒與主線程之間的通訊

2022-03-12 20:17:22 字數 1036 閱讀 5565

先說明一下,本人最近遇到了什麼問題,就是在寫寫訊息佇列的時候,發現訊息佇列每次接收乙個訊息的時候都是建立了乙個新的執行緒。這樣就導致了訊息處理的時候沒有在主線程上進行,然而其中的一些步事項是要通過主線程才能操作的。這樣就引出了乙個子執行緒怎麼去通知主線程要做哪些事情呢?

為了解決上面的問題我找了好的多資料,好多都是用委託,去解決了,然後我又看了我的專案通過這種begininvoker的這種辦法解決不是很好用。並不能解決的當前的問題,在這個時候我發現了synchronizationcontext物件。這個對像的用處就是可以記錄乙個執行緒的上下文然後再子執行緒處理完之後,要用到主要程去操作的時候可以去post或者send乙個事件支解決,這樣就很方便,**如下:

class

testclient

private

void onconnected(object state)//

由於是主線程的同步物件post呼叫,這個是在主線程中執行的

private

void dowork()//

這個是workthread執行緒執行的

}

view code

注意:synchronizationcontext的物件不是所有執行緒都被附加的,只有ui主線程會被附加。對於ui執行緒來說,是如何將synchronizationcontext這個物件附加到執行緒上的呢?

在form1 form = new form1()之前,synchronizationcontext物件是為空,而當例項化form1窗體後,synchronizationcontext物件就被附加到這個執行緒上了。所以可以得出答案了:當control物件被建立的同時,synchronizationcontext物件也會被建立並附加到執行緒上。所有在使用時,一定要等窗體initializecomponent(); 這個完成後 它才能得到乙個不這null的物件。

最後synchronizationcontext的sendt()和post()二個方法的區別:

send() 是簡單的在當前執行緒上去呼叫委託來實現(同步呼叫)。也就是在子執行緒上直接呼叫ui執行緒執行,等ui執行緒執行完成後子執行緒才繼續執行。

c 子執行緒與主線程之間的通訊

先說明一下,本人最近遇到了什麼問題,就是在寫寫訊息佇列的時候,發現訊息佇列每次接收乙個訊息的時候都是建立了乙個新的執行緒。這樣就導致了訊息處理的時候沒有在主線程上進行,然而其中的一些步事項是要通過主線程才能操作的。這樣就引出了乙個子執行緒怎麼去通知主線程要做哪些事情呢?為了解決上面的問題我找了好的多...

內部通訊 主線程和子執行緒之間的通訊

1.主線程建立handler類的物件,重寫handlemessage方法 handler handler new handler public void handlemessage message msg switch msg.what case 0 break 2.主線程建立乙個子執行緒 用thr...

C 參考 主線程和子執行緒之間的引數傳遞

幾個程序在大多數情況下要包含很多的子執行緒,那麼他們之間免不了的要互相傳遞很多的引數,那麼引數怎麼傳遞的呢?第一種方法 thraed類有乙個帶引數的委託型別的過載形式,這個委託的定義如下 delegate void parameterizedthreadstart object obj 這個thre...