2011-06-01 77 views
1

我在製作C++/CLI Forms應用程序。Visual Studio C++如何讓表單在調用耗時函數時不會凍結?

在我的應用程序的主窗口中,我有一個按鈕。當我點擊那個按鈕時,我打電話給Load函數。下面存在C++/CLI代碼:

private: System::Void Button1_Click(System::Object^ sender, System::EventArgs^ e) { 
    Load(); 
} 

功能Load()是一個耗時的功能。它使用cURL庫向網站發送多個HTTP GET請求。

在Form I中還包含一個ProgressBar和一個textlabel,用於顯示當前發送的請求。

問題是,當我點擊按鈕並調用函數時,窗體就凍結了。在Load()函數被調用時,我看不到progressBar和Textlabel改變它的值,Form就被凍結了。當Load()函數完成發送請求時,突然進度條將其值更改爲100%。

我希望我能夠清楚地描述我的問題,以便理解它。

+0

此代碼是不是C++,這是C++/CLI - 完全不同的語言。 – ildjarn 2011-06-01 15:28:51

+1

您需要專門研究線程 - BackgroundWorkerThread。 – ChrisF 2011-06-01 15:30:12

+0

謝謝@ChrisF這就是我一直在尋找的東西。最後,我使用Visual Studio Toolbox中的backgroundWorker控件做了它。謝謝! – Darxis 2011-06-02 17:54:24

回答

1

在您更新滾動條值之後,將您的任務移至另一個線程,或致電Application.DoEvents();

1

可以將任務分解爲更小的部分(設計一個有限狀態機或使用continuations)或使用單獨的線程。

第一種方法需要更多的習慣,但對於有經驗的程序員來說更容易。線程化需要同步,這是非常詳細的,並導致很多隱藏的零星的錯誤,這是非常難以調試。

1

每次更新表單的元素(比如Form1)時,都會調用Form1.Refresh()。它會立即顯示結果。

0

任何行命令,使任何可能加載時間之前...這樣寫:

System::Windows::Forms::Application::DoEvents(); 
+0

我不明白你在編輯什麼? – 2014-09-19 17:30:38

相關問題