感覺快出來了
但是現在問題是怎麼每次都是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})
可能會需要兩個執行緒
可能是說我應該在跑圖片之前先讓他去走SQL
透過SQL的結束去結束掉圖片
SQL要開一個執行緒的話很麻煩
太複雜了
不好用
應該是我一個Button下面做的事情太多,
沒有切得很好
如果要做可能會需要大改版
終結這篇
==========================================
猜測可能是因為切換圖片的For 太慢
先把圖片切好Bitmap()
把切好的圖片傳到 BackGroundWorker參數
然後呼叫背景執行就單純抽換圖片
要測看看
'進度回報的部分
不是說死的只能做百分比回報
可以做像是資料筆數到了多少的回報
'查一下怎麼看目前存活的Thread數目
java的我忘了
沒道理VB沒
先跳過
'New Threading.WaitCallBack(Addressof 另一執行緒執行的方法), 方法參數
Threading.ThreadPool.QueueUserWorkItem(New Threading.WaitCallback(AddressOf startJob), TextBox1.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
沒有留言:
張貼留言