2011年7月25日 星期一

VB 多執行緒下,委派(1)


  感覺快出來了

但是現在問題是怎麼每次都是SQL跑完才去背景執行換圖
好怪
找不到原因......

又找到一個可能
可能會需要兩個執行緒
可能是說我應該在跑圖片之前先讓他去走SQL
透過SQL的結束去結束掉圖片


SQL要開一個執行緒的話很麻煩
太複雜了
不好用


應該是我一個Button下面做的事情太多,
沒有切得很好


如果要做可能會需要大改版


終結這篇
==========================================
猜測可能是因為切換圖片的For 太慢
導致回報進度(切換圖片)太慢

碼的卡到大魔王了...


先把圖片切好Bitmap()
把切好的圖片傳到 BackGroundWorker參數
然後呼叫背景執行就單純抽換圖片
要測看看

==========================================

  '背景執行完成,或中途取消

    Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted

        If e.Cancelled Then

            TextBox2.Text = "cancel"

        Else

            TextBox2.Text = e.Result.ToString

        End If


        '==================================================

        '這邊似乎VB不能寫成三元運算

        '猜測是說,他會抓住 取消的 Expression 狀態 (e.cancel)

        '然後比對 true, false

        '但是取消時,backgroundworker 已經停止,所以在近一步去抓 false的 e.result

        '會告知說 已取消,所以抓不到東西

        'TextBox2.Text = IIf(e.Cancelled, "cancel", e.Result.ToString)

        '=========================================


        Button1.Text = "go"

        Button1.Enabled = True

    End Sub


=========================================

BackgroundWorker

好像是說
應該在會跨執行緒呼叫UI Thread的控制項操作時
將該控制項的東西丟給RunWorkerASync(控制項操作)

這個要在測試看看

先跑跑範例的東西熟了在玩


'進度回報的部分
不是說死的只能做百分比回報


可以做像是資料筆數到了多少的回報


'查一下怎麼看目前存活的Thread數目
java的我忘了
沒道理VB沒
先跳過

==================================

感覺怪怪的,

像是說有建立新的thread
但是他卻依然沒辦法跑
感覺像是沒建立成功的樣子

要在測試看看

果然有點複雜就不一樣了..

=======================================

可能說,跑GIF要放在UI Thread

然後背後執行的動作放到 背景 Thread 去執行
當背景動作結束,去調整UI Thread 控制項的屬性visible,
然後UI Thread就可以根據這個改變去停止無窮迴圈

 ======================================================

'New Threading.WaitCallBack(Addressof 另一執行緒執行的方法), 方法參數

 Threading.ThreadPool.QueueUserWorkItem(New Threading.WaitCallback(AddressOf startJob), TextBox1.Text)


'New 委派型別(Addressof 委派方法), New Object(){參數}

     Me.Invoke(New updatetextboxHandler(AddressOf print), New Object() {Text})



 '委派方法宣告 (是一個型別)

    Delegate Sub updatetextboxHandler(ByVal text As String)

    '委派實際執行方法

    Private Sub print(ByVal text As String)

        'result顯示結果

        TextBox2.Text = text

    End Sub


================================
照著範例測試了一個會抓設定的目錄下
所有子目錄裡面檔案
去計算說該目錄底下有多少檔案數,以及所有檔案大小

form上面有一個timer,每50毫秒變換一次時間
所以UI Thread 總是在執行 Timer的東西
當我按下按鈕去計算檔案的時候,
變成會卡住先做我的動作,畫面整個鎖死

就透過多執行緒+委派(控制UI Thread 控制項操作)
按下按鈕,跑另外一個Thread 去計算
UI Thread 繼續跑Timer


雖然是這樣說
但是實際上執行感覺怪怪的
當我按鈕執行查詢目錄下子目錄夠深的計算
UI 畫面還是會鎖住

雖然說等她跑完,timer還是可以跑出正確時間(顯然計算期間他還是一直在跑timer)


靠可以了

因為我剛剛忘了把他丟到Thread Pool
讓他建立新執行緒等待被執行
所以剛剛等於還是在UI Thread上面跑才會這樣
========================

跨執行緒作業無效: 存取控制項 'textBox1' 時所使用的執行緒與建立控制項的執行緒不同


有意點點感覺
就差測試了
但是太累了
改天~

============================

大概知道說要建立委派與叫用委派

相同的function or sub


才能執行委派

[原創]Callback與Delegate原理


=====================================================

winForm 在 multi threading 的情況下, 是否一定要 delegate method 才可讓 output 在控制上顯示



跨執行緒作業無效



利用Invoke一個方法,甚至帶入參數

這部分要在查一下

==========================================================
委派的用途及概念
http://www.blueshop.com.tw/board/show.asp?subcde=BRD20100721085817I8Q

沒有留言:

張貼留言