none
[VB6]Background Threading... RRS feed

解答

  • VB6 要寫多緒程式比較困難,需要呼叫到 Thread 的 API .
    VB.NET (.NET 2.0) 則有 BackgroundWorker 可以使用,如果是 .NET 1.x 則要自行處理 Thread 作業 .
    2006年12月6日 下午 02:26
    版主
  • 拷貝檔案也可以讓 Process Bar 繼續跑啊。

    你是如何複製檔案?純粹使用 FileCopy 是沒有 ProcessBar 的。

    自己寫複製程式碼呼叫 Timer 時,要分成三段來看:

    1. object.Refresh : 立即更新物件狀態
    2. DoEvents : 讓 CPU 來做其他事,若沒使用 Refresh 立即更新,有可能輪不到
    3. 呼叫 API Sleep 1 : 將 VB 釋放佔用 CPU 狀態,使 CPU 不會跑到 100% (即時性系統不適用,檔案複製受磁碟頻寬影響,CPU 處於等待回應中,應呼叫 Sleep)

    當然,很多網路初始連線時會讓執行緒完全處於等待期,這類是沒辦法的。VB6 的限制就是這樣,你可以考慮自己呼叫 API 來建立執行緒,不過我試過,網路上你也可以找找看,會發生意外程式終止,我也追蹤過,大部分情況都會發生在 oleaut32.dll 上,因為 VB6 會自動的幫你作強制轉型,這個動作在 work Thread 上會死。

    2006年12月6日 下午 03:45
    版主

所有回覆

  • VB6 只能在 ActiveX EXE 用多緒,其他情況下會導致應用程式失敗。

    你的背景作業是指什麼?在 Windows 下本身是多程序,在不同程式下本身就是 Multi-Process 再跑,請把問題定義清楚。

    2006年12月6日 上午 09:36
    版主
  • 我的意思是..當程式在執行一個大量運算時..
    我希望程式的UI還是可以回應使用者,不用同時執行其它運算....
    但可以讓UI產生動作,不會讓使用者以為程式當掉了...
    這個無法用Doevents來達成...Doevents對迴圈比較有效...
    舉例,我copy一個很大的檔案,程式必須要等檔案copy完成後...
    才能執行下一個指令,整個程式就像當掉一樣...就算用一個Timer來產生Process Bar...
    Bar也是完全不會動...

    2006年12月6日 下午 02:10
  • VB6 要寫多緒程式比較困難,需要呼叫到 Thread 的 API .
    VB.NET (.NET 2.0) 則有 BackgroundWorker 可以使用,如果是 .NET 1.x 則要自行處理 Thread 作業 .
    2006年12月6日 下午 02:26
    版主
  • 拷貝檔案也可以讓 Process Bar 繼續跑啊。

    你是如何複製檔案?純粹使用 FileCopy 是沒有 ProcessBar 的。

    自己寫複製程式碼呼叫 Timer 時,要分成三段來看:

    1. object.Refresh : 立即更新物件狀態
    2. DoEvents : 讓 CPU 來做其他事,若沒使用 Refresh 立即更新,有可能輪不到
    3. 呼叫 API Sleep 1 : 將 VB 釋放佔用 CPU 狀態,使 CPU 不會跑到 100% (即時性系統不適用,檔案複製受磁碟頻寬影響,CPU 處於等待回應中,應呼叫 Sleep)

    當然,很多網路初始連線時會讓執行緒完全處於等待期,這類是沒辦法的。VB6 的限制就是這樣,你可以考慮自己呼叫 API 來建立執行緒,不過我試過,網路上你也可以找找看,會發生意外程式終止,我也追蹤過,大部分情況都會發生在 oleaut32.dll 上,因為 VB6 會自動的幫你作強制轉型,這個動作在 work Thread 上會死。

    2006年12月6日 下午 03:45
    版主
  • 這是我早期的檔案複製程式碼,就支援用 Timer 跑進度

    http://tlcheng.twbbs.org/TLCheng/Basic/vbcfile.htm#myFileCopy

    早期沒有把 Sleep 放進去,後來都呼叫 MyDoEvents ,把 Sleep 包進去。

    http://tlcheng.twbbs.org/TLCheng/Net/NetList.aspx?Action=Function&Module=31&Function=219

    2006年12月6日 下午 03:55
    版主
  • 我是用FileSystemObject來copy資料....
    如果當Copy到一個大檔時,就要等到copy完成後UI才會有回應...
    如果我要用Sleep方法讓UI可以有回應...
    應該如何做呢?
    2006年12月7日 上午 01:45
  • fso 本身是 COM 物件,並沒有介面,所以會是這樣。

    要有進度列跟畫面回應就只能回到原來的基礎,重新構建,不然我幹麻自己辛苦去寫一個 MyFileCopy ?

    比如說你今天開 Smart ,可是你卻希望他要有露營車的能力,這是你一開始就選錯車了,你若是不想花錢買露營車,就要自己做一台。

    基本上 fso 是設計給無視窗介面的 Script 用的,所以 fso 根本就沒考量介面的問題,只是很多 VB6 的書或網站喜歡拿來用在 VB6 內,才會讓很多人誤會是 VB6 的元件,更多關於 fso 的說明,你可以下在 Windows Script 5.6 的線上手冊瀏覽。

    引用 FSO 設計用途及條件如下:


    FileSystemObject (FSO) 物件模型可讓您使用一般常用的 object.method 語法,以及為數眾多的屬性、方法和事件來處理資料夾和檔案。

    使用這項以物件為基礎的工具,您可以:

    • 利用 HTML 來建立網頁
    • 利用 Windows Script Host 來建立 Microsoft Windows 的批次檔
    • 利用 Script 控制項為其他程式語言所開發的應用程式提供 Scripting 功能

    由於在客戶端使用 FSO 會加重駭客存取客戶端區域檔案系統所造成的安全性問題,所以本文假定使用 FSO 物件模型所建立的 Script,是透過伺服端的 Internet 網頁來執行的。因為使用的是伺服端,所以 Internet Explorer 預設的安全性設定不允許客戶端使用 FileSystemObject 物件。覆蓋這些預設值可能會使本機電腦的檔案系統受到駭客威脅,進而造成檔案系統的整體性完全被破壞,導致資料遺失或更嚴重的後果。

    [下略]

    2006年12月7日 上午 02:28
    版主
  • 嗯,謝謝璉璉老大....
    沒想到還是沒辦法...只是FSO真的好用....^^
    只好想看看別的方法了..感恩!!
    2006年12月7日 上午 06:15