2012-07-25 18 views
0

我使用3.9.7 cURL庫從互聯網上下載文件,所以我創建了一個viculo的動態bibioteca。 DLL使用VC++ 6.0編寫的問題是,當我從我的vb6應用程序窗口中調用我的函數鎖定並解鎖後,只有在你下載了文件後,我該如何解決這個問題?爲什麼在調用用C寫的函數時,vb6應用程序的窗口會停止運行?

+0

vb6沒有線程,如果對DLL的調用需要很長時間才能執行,可以做的事情不多。 – Jake1164 2012-07-25 19:30:02

+2

更好地使用比基於阻止調用的庫更復雜的東西。你可以使用VB6內建的AsyncRead方法,Internet Transfer Control(「Inet」),MSXML的XmlHttpRequest對象或Windows自己的WinHttpRequest對象。 – Bob77 2012-07-25 19:51:49

回答

2

問題是,當您從DLL調用函數時,它會「阻止」應用程序的執行,直到完成。基本上,執行從執行函數調用的代碼片段到函數調用內部的代碼,然後在函數內部的代碼完成運行後,纔會在函數調用後返回到下一行。實際上,這就是所有函數調用的工作原理。您可以通過在VB 6開發環境中單步執行代碼來看到這一點。

您通常不會注意到這一點,因爲被調用函數內部的代碼在控制返回給調用者之前並不需要很長時間才能執行。但在這種情況下,由於您從DLL調用的函數正在進行大量處理,因此需要一段時間才能執行,因此它會在相當長一段時間內「阻止」應用程序代碼的執行。

這是您的應用程序窗口似乎凍結的原因的一個很好的一般性解釋。技術上更多一點,這是因爲負責處理用戶與屏幕元素交互的消息泵沒有運行(它是代碼的一部分,暫時掛起,直到您調用的函數完成處理)。這對於VB程序員來說更難以理解,因爲在VB的世界中沒有任何這種基本的東西暴露出來。這一切都發生在幕後,就像在C程序中一樣,但通常不必處理任何事情。有時候,抽象會泄漏,而內在的東西會帶着醜陋的頭腦。這是其中的一種情況。

正如其他人所暗示的,這個普遍問題的正確解決方案是在後臺線程上運行冗長的操作。這使您的主線程(現在是唯一一個運行應用程序的主線程)可以繼續處理用戶輸入,而另一個線程可以處理數據並在處理數據返回主線程時返回完了。當然,電腦不能一次做多件事,但操作系統在一個任務和另一個任務之間快速切換的神奇意味着你可以模擬這一點。這樣做的機制涉及線程。

捕獲來的事實是,VB 6環境沒有任何類型的支持創建多個線程。你只能得到一個線程,這是你的應用程序運行的主線程。如果你凍結了那個執行,即使是暫時的,你的應用程序也會凍結,就像你已經發現的那樣。但是,如果您已經在編寫C++ DLL,那麼沒有理由不能在VB 6應用程序中創建多個線程。你只需要自己處理所有事情,就好像你在使用另一種低級語言如C++一樣。在後臺線程上運行C++代碼,並僅在完成完成時將其結果返回給主線程。與此同時,您的主線程是免費的。

但是,這仍然是一個相當多的工作,特別是如果你對Win32編程和圍繞多線程的問題沒有經驗。可能更容易找到支持異步函數調用的不同庫。 Antagony suggests使用VB的AsyncRead method。這可能是一個很好的選擇;正如Karl Peterson在鏈接文章中所說的那樣,它將所有內容都保存在純VB 6代碼中,這對於未來的維護程序員來說可以是一個真正的節省時間和好處。唯一的問題是,一旦你獲得它,你仍然需要進程數據。如果這很慢,你就回到你從哪裏開始......

+0

哇!很好的詳細的+1:p – Deanna 2012-07-26 08:41:01

+0

明白了,謝謝! – 2012-07-26 17:40:09

2

檢出this article,它演示瞭如何在用戶控件中使用鮮爲人知的方法異步傳輸大文件。

相關問題