C 中的執行緒

2022-02-01 09:56:52 字數 2208 閱讀 6891

.net框架提供很多方法來實現多執行緒程式設計。我想展示如何通過同步訪問使用者介面去執行乙個工作執行緒(例如,乙個讀取記錄集並要在乙個窗體中填充控制項的執行緒)。

執行執行緒,我用:

.net只允許control中建立的執行緒去呼叫system.windows.forms.control的函式。要想從另乙個執行緒中訪問system.windows.forms.control中的函式,你需要使用control.invoke(同步呼叫)或control.begininvoke(非同步呼叫)函式。比如說顯示資料庫的記錄,我們就需要invoke

要想實現這個,我們要用:

等待「執行緒已經停止」事件;

invoke呼叫是被主線程所處理的。

執行緒函式檢查每個迭代,看「停止執行緒」事件是否發生了。如果這個事件發生了,函式呼叫清理操作,觸發「執行緒已經停止」事件,並返回。

demo有兩個類:mainform和longprocess

"stop thread"按鈕或關閉窗體時停止。1//

mainform.cs23

namespace

workerthread440

41//

4243

//start thread button is pressed

44private

void

btnstartthread_click(

object

sender, system.eventargs e)

4560

6162

//worker thread function.

63//

called indirectly from btnstartthread_click

64private

void

workerthreadfunction()

6572

73//

stop worker thread if it is running.

74//

called when user presses stop button or form is closed.

75private

void

stopthread()

76), 

92100,93

true

) )94

979899}

100}

101}

102103

//add string to list box.

104//

called from worker thread using delegate and control.invoke

105private

void

addstring(string s)

106109

110//

set initial state of controls.

111//

called from worker thread using delegate and control.invoke

112private

void

threadfinished()

113117

118}

119}

120121

122123

namespace

workerthread

124);

146147

148//

check if thread is cancelled

149if

( m_eventstop.waitone(0, 

true

) )150

159}

160161

//make synchronous call to main form

162//

to inform it that thread finished

163m_form.invoke(m_form.m_delegatethreadfinished, 

null

);164

}165

166}

167}

168169

170171

172

C 中的多執行緒

多執行緒 前台執行緒 只有所有的前台執行緒都關閉才能完成程式關閉 後台執行緒 只要所有的前台執行緒結束,後台執行緒自動結束 產生乙個執行緒的4個步驟 編寫產生執行緒所要執行的方法 引用system.threaing命名空間 例項化thread類,並傳入乙個指向執行緒所要執行方法的委託。這時候這個執行...

c 多執行緒中的執行緒同步 Event

互斥量mutex 與 互斥量cs 中,執行緒的編號,也就是i是在主線程中1的,但是子執行緒裡列印出的 i 卻非常混亂,因為主線程裡的寫操作 和子執行緒裡的讀操作是同時進行的,這個有點像資料庫裡的事物,寫操作分為三個步驟,從記憶體中讀取i的值放入暫存器,第二步在暫存器裡加1,第三步寫回記憶體,而子執行...

C 執行緒呼叫主線程中的控制項

由於專案的需要,最近幾天一直在做串列埠和資料庫。由於c 使用的時間不長,所以在編寫 和除錯的過程中總是遇到意想不到的問題,比如在使用串列埠接收資料的時候,在接收資料事件中想把接收的資料放入乙個textbox作顯示,但是明明非常簡單的 在編譯的時候總是提示有錯誤。後來檢視網上資料,才知道c 還有委託,...