線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2047
推到 Plurk!
推到 Facebook!

VB2008多執行續下有關委派實體在主執行緒上執行的問題

答題得分者是:syntax
chang1981
一般會員


發表:31
回覆:28
積分:11
註冊:2008-09-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-03-01 08:33:49 IP:61.216.xxx.xxx 訂閱
各位前輩好~
小弟最近在寫一個多執行緒的應用程式
但是發現一個不知道怎樣解決的問題 就是
"副執行緒呼叫委派時 主執行緒中的委派實體似乎不會馬上執行 因為主執行緒正在一個函試當中, 我trace的結果是要等主執行緒的函試跳出後, 才會執行委派呼叫的函式 這造成了我在回圈當中設定的一些累加數值最後被委派實體取用時早就被歸零了..."

以下是我程式式的大概架構


'***************************************
Public Class MainForm '主執行緒
Delegate Sub Real_Tool(ByVal T As Integer)'委派

public sub Real_Tool_Pack
程式碼區段C
end sub

pblic sub GOGOGO
'宣告一號處理元
Dim SliceProcesser1 As New System.Threading.Thread(AddressOf Me.Thread_Process_Slice)
SliceProcesser1.IsBackground = True

'宣告二號處理元
Dim SliceProcesser2 As New System.Threading.Thread(AddressOf Me.Thread_Process_Slice)
SliceProcesser2.IsBackground = True

''''''''''''迴圈''''''''''''''''''
SliceProcesser1.start
SliceProcesser2.start

''''''''''''''''''''''''''''''''''''''''
迴圈結束
程式碼區段B

end sub



public sub Thread_Process_Slice
程式碼區段A
Me.BeginInvoke(New Real_Tool(AddressOf Me.Real_Tool_Pack), New Object() {T})
end sub

end Class

請參考上述架構
根據我的理解
執行順序應該是如下 (SliceProcesser2應會穿插其中先不管)

SliceProcesser1.start
程式碼區段A
委派
Me.BeginInvoke(New Real_Tool(AddressOf Me.Real_Tool_Pack), New Object() {T})
程式碼區段C
迴圈結束
程式碼區段B

但是實際上執行起來竟然是
程式碼區段A
委派
Me.BeginInvoke(New Real_Tool(AddressOf Me.Real_Tool_Pack), New Object() {T})
跳回主執行緒繼續
迴圈結束
程式碼區段B

程式碼區段C<-----現在才進入執行 我在回圈中設定的值全都泡湯了


這樣的情形我只能判斷是因為
委派實體Real_Tool_Pack無法取得主執行緒的控制權(被GOGOGO佔用了)
只能等迴圈繼續跑完後(或者是GOGOGO執行完)才能進入
那請問我該如何解決這樣的問題呢?
還是說有別種更好的寫法
感激各位高手的幫忙

備註:
因為看資料說begininvoke是非同步執行
所以我也常是使用invoke來做 問題還是沒解決
嘗試用syncLock 但是也不知道放在哪裡 要lock誰比較正確
也不成功

syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-03-01 09:26:08 IP:59.125.xxx.xxx 訂閱
覺得你設計上的邏輯本身有問題

目前看來,這樣的結果,是正確的,而且與「委派實體Real_Tool_Pack無法取得主執行緒的控制權(被GOGOGO佔用了)」無關
是 OS 分配的結果

既然是分到 Thread 內做,就表示應與 Main Thread 沒有相依性,如果有,那你的日子,會很難過
而迴圈,是你相依性的問題所在
如果,是用來接收資料,就應該要等資料進來
如果,使用來發送資料,那就應該最後才走人

建議

迴圈要等所有 Thread 結束,或是 Thread 必須先做判斷看迴圈結束否



===================引 用 chang1981 文 章===================
各位前輩好~
小弟最近在寫一個多執行緒的應用程式
但是發現一個不知道怎樣解決的問題 就是
"副執行緒呼叫委派時主執行緒中的委派實體似乎不會馬上執行因為主執行緒正在一個函試當中, 我trace的結果是要等主執行緒的函試跳出後, 才會執行委派呼叫的函式 這造成了我在回圈當中設定的一些累加數值最後被委派實體取用時早就被歸零了..."

以下是我程式式的大概架構


'***************************************
Public Class MainForm '主執行緒
Delegate Sub Real_Tool(ByVal T As Integer)'委派

public sub Real_Tool_Pack
程式碼區段C
end sub

pblic sub GOGOGO
'宣告一號處理元
Dim SliceProcesser1 As New System.Threading.Thread(AddressOf Me.Thread_Process_Slice)
SliceProcesser1.IsBackground = True

'宣告二號處理元
Dim SliceProcesser2 As New System.Threading.Thread(AddressOf Me.Thread_Process_Slice)
SliceProcesser2.IsBackground = True

''''''''''''迴圈''''''''''''''''''
SliceProcesser1.start
SliceProcesser2.start

''''''''''''''''''''''''''''''''''''''''
迴圈結束
程式碼區段B

end sub



public sub Thread_Process_Slice
程式碼區段A
Me.BeginInvoke(New Real_Tool(AddressOf Me.Real_Tool_Pack), New Object() {T})
end sub

end Class

請參考上述架構
根據我的理解
執行順序應該是如下 (SliceProcesser2應會穿插其中先不管)

SliceProcesser1.start
程式碼區段A
委派
Me.BeginInvoke(New Real_Tool(AddressOf Me.Real_Tool_Pack), New Object() {T})
程式碼區段C
迴圈結束
程式碼區段B

但是實際上執行起來竟然是
程式碼區段A
委派
Me.BeginInvoke(New Real_Tool(AddressOf Me.Real_Tool_Pack), New Object() {T})
跳回主執行緒繼續
迴圈結束
程式碼區段B

程式碼區段C<-----現在才進入執行 我在回圈中設定的值全都泡湯了


這樣的情形我只能判斷是因為
委派實體Real_Tool_Pack無法取得主執行緒的控制權(被GOGOGO佔用了)
只能等迴圈繼續跑完後(或者是GOGOGO執行完)才能進入
那請問我該如何解決這樣的問題呢?
還是說有別種更好的寫法
感激各位高手的幫忙

備註:
因為看資料說begininvoke是非同步執行
所以我也常是使用invoke來做問題還是沒解決
嘗試用syncLock 但是也不知道放在哪裡 要lock誰比較正確
也不成功

系統時間:2024-05-01 14:33:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!