2013-01-08 67 views
5

我有一個應用程序可以運行相當長的時間來掃描數據庫。
在此過程中,我通過使用processmessage保持程序響應。
當我的進度條更新並添加時,會觸發此過程消息。
這很好,但大多數情況下,但是當數據庫變大時,進度條需要花費更長的時間才能跳出1%,直到那個時候程序才變得沒有響應。除了processmessage之外,還有什麼可以用來保持程序響應?

除了processmessages之外,還有另一種方法讓我的程序保持活躍嗎?

+1

嘗試使用Application.HandleMessage代替。還將LastPercentage存儲爲變量。計算NewPercentage並在NewPercentage = LastPercentage時退出。 –

+0

@CapeCodGunny沒有這樣的事情。你的意思是'Application.HandleMessage'?爲什麼這會有所幫助? –

+0

@David - 謝謝我編輯了我的評論。它打破並迫使一個更新不是所有未決的Windows更新。 –

回答

8

多線程是答案。標準的Delphi應用程序基本上是一個單線程應用程序,可以一次完成一件事。因此,gui鎖定,如果它正在做其他事情,它不能保持響應。

如果你想有一個敏捷的gui並且同時做繁重的工作,你需要在單獨的一個或多個線程中進行繁重的工作。這樣,你的主線程就可以確保你有一個響應式程序,並且工作線程完成繁重的工作。 這適用於繁重的數據庫工作,但也適用於下載文件或情況,例如遠程服務器的答案可能需要很長時間。

但是,這個答案可能會給你更多的問題,然後回答,因爲解釋如何使用多線程將對這個問題的解釋太大。

但是還有一件事:對數據庫代碼進行長時間的嚴格審視。你是如何從數據庫中檢索記錄的,數據庫中是否有好的索引等等等等。在開始考慮多線程之前,你可以通過優化代碼來獲得瘋狂的速度提升。

我找到了以下資源:http://thaddy.co.uk/threads/你可以下載圖片在:http://cc.embarcadero.com/item/14809是非常有用的線程教程。

+5

標準的Delphi應用程序不是單線程的。擁有多個線程並不能解決問題。將長時間運行的工作從GUI線程移出是解決問題的方法。 –

+0

@DavidHeffernan現在你讓我困惑。我總是覺得,除非你專門開始額外的線程,否則一個用於所有意圖和目的的標準Delphi程序都表現爲單線程程序。經過長時間的GUI線程工作正是我的意圖和答案。 –

+0

我的意思是你應該在答案中說清楚。您沒有明確說明您的建議是將數據庫工作放在另一個線程上。 –

3

如果要使GUI程序顯示爲響應式,則必須及時地處理消息隊列。沒有替代。

當涉及到運行數據庫查詢時,在不凍結您的用戶界面的情況下執行該操作的方法是將查詢移至其他線程。

+0

從線程更新UI的策略是什麼?當主程序退出但線程仍在工作時,我總是遇到這個問題。 –

+0

@LeonardoHerrera我不明白這兩個問題是如何相關的。爲了從線程更新UI,通常消息傳遞(而不一定是Windows消息)是最好的方法。 –

相關問題