2011年9月26日 星期一

#VB multiThreads 學習

感覺現在的東西如果要寫成多執行緒
變成全部都要改寫的樣子

要做跟不做......

如果切得不好,變成動畫跑不出來
(另一個 thread 主要工作要跑的夠久)

'要注意某些控件必須關閉功能
讓他不能做其他事.....那不是乾脆不要弄多執行緒
要再想想~

==========================================
測試 EXCEL 轉檔
目前會發生說多執行緒同時跑,
有機會碰到檔案名稱相同
變成多個執行緒有機會叫用同一個檔案名稱
什麼時候去判斷同檔名

發現說,有些Thread在判斷有沒有相同黨名的時候
會跟要殺TXT檔案的時候,兩個鄉衝

除非一開始就配好不重複的黨名
不然就是說確定所有執行緒跑完
一次全部殺掉
但是怎麼確定


用VB.NET實現多執行緒


VB.NET開發Thread Pool式網路芳鄰掃瞄程式
http://www.asp.com.tw/news/knowledge/1/info_tc1.htm
 '以要執行函數的位址為參數建立WaitCallback物件
            callBack = New WaitCallback(AddressOf Dog(I).Bark)
            '在QueueUserWorkItem時, 還可傳入一個Object作為呼叫該函數的參數
            '當然, 透過類別的Property也是另一種指定參數的作法, 而且更有彈性
            ThreadPool.QueueUserWorkItem(callBack, I)


'多工轉檔,目前做法會忽略異常資訊
只單純做轉檔部分
或是說需要另外紀錄在最後show出來之類的
要再想想看

'合併計算,可能要分兩部分走,
合併走共享資源變數,批次走區域變數
確定所有執行緒走完以後
回主執行緒做distinct, sum, order by 動作
有點麻煩,再看看好了

==========================================
測試 CR報表
目前卡在 開啟瀏覽報表 會提示要求輸入登入資料庫帳密 (之前沒有)
報表 DataSource 是一個 DataTable,應該是不會要求登入資料庫才對啊

@大概知道是因為他找不到登入資料庫的 DataSet
所以在報表上面重新設定好之前訂好的DataSet就可以了

再來就是多執行緒一次多開,會有 "引動過程的目標傳回例外狀況。"
multithreading - 'System.Reflection.TargetInvocationException'


 //若是已經取消背景作業,就不去更新表單資訊,
            //否則會引發 [引動過程目標例外狀況]。

@應該跟我關閉報表畫面後
thread 會被強制關閉之類的問題有關吧

看有沒有辦法說能在關閉報表之後
對thread做安全的關閉動作


@大概發現說
如果用的是全域Form去跑
不管事show,    => 猜測是show完,Thread跑完結束,連帶關掉show造成
showDialog  => 猜測是讀取同一個form,前一個thread還沒結束,下一個thread又呼叫這個form
怎樣都會發生

如果宣告 Form去跑
show 會發生    => 猜測是show完,Thread跑完結束,連帶關掉show造成
showDialog 還是會發生.....
@DisconnectedContext MDA警告?RuntimeCallableWrapper 
關閉報表表單以後,通常會出現這個警告訊息'

應該是跟 報表相關變數資源鏈結沒有適時關閉有關係


目前將呼叫的Thread 設為 STA 單一執行緒
似乎就不會再出現這個問題
要在測試看看


.NET Threading Model(STA and MTA)


STA(single threaded apartments)。apartment只是一个逻辑上的概念,它可以包含一个或多个线程。一个AppDomain可以包括一个或多个apartment。STA是指该apartment中只能包含一个thread。
MTA(multi threaded apartments)。指该apartment中可以包含多个thread。
STA and MTA 之间最大的区别就是MTA 可以在同一个apartment 中使用所有的共享资源并发执行多个线程。 而多个STA虽然可以共享数据,但是不能并发执行线程,存在性能问题。



@多執行緒開啟報表表單
會發生 引動過程目標例外狀況

因為 CrystalDecisions.CrystalReports.Engine.ReportDocument 可能再引用外部程式的時候
會動到某塊記憶體吧

當載入資料以後其他執行緒也跟著補上
又透過同個com元件對該記憶體做事情
而產生例外
@目前透過 將 ReportDocument 宣告為全域變數
以 SyncLock 該報表文件變數

   '載入報表資源動作

   End SyncLock

讓每個 Thread 依序執行載入報表動作


========================================
可能變成要走兩個完全不同的SQL
A.讓form上面呈現資料 (相關表單,變數為全域變數)
B.部呈現資料,做multi-thread轉檔 (相關表單為區域變數)


=======================================
目前測試可以執行多執行緒轉檔
但是有點邏輯上的錯誤
應該是變數切的不夠好
造成說同時轉檔寫入檔案會寫到相同內容資料

看是txt部分,還是轉excel部分


@發現說 DataGridView宣告為區域變數,
並且指定 DataSource,
是沒有意義的
不會產生任何資料鏈結

除非DataGridView 綁定在 form 表單之上

也就是說 DataGridView 可能無法當作multi-thread 的容器
不然就是要再想其他方式
直接傳 Table 之類的

目前透過傳 Table 資料轉 Excel

'有寫入相同檔名資料問題發生
要家判斷如果亂數檔已存在
重新亂數
======================================

如何在 Visual Basic.NET 或 Visual Basic 2005 中建立的執行緒



Thread.Start 方法 (Object)







How to pass multiple parameters in thread in VB




可以用~再來就看怎麼切

變數宣告藥用區域變數

最後結果再丟到痊癒變數


可能連轉檔得時候,用的datagridview都要變成區域宣告的

目前跑的都是讓他直接跑form上面宣告的DGV

挖靠超麻煩
這樣DGV顯示的數值也要弄進來



======================================
目前測試 partPrice可以跑
只要注意遺下
需要兩個背景執行
一個跑動畫
一個跑後端資料庫(主要工作)
主執行緒專注在其他東西 (這邊怪怪的,要再研究)

沒辦法把主要工作直接放在 主執行緒
會變成說圖沒辦法跑
======================================
The Parallel Programming Of .NET Framework 4.0(1) - Beginning

沒有留言:

張貼留言