3

我有興趣使用更具響應性的設計和功能製作更好的程序。現在,當我創建可遠程訪問數據的程序時,我的界面會凍結,並且沒有動畫GIF可以在此條件下工作。如何在線程下使用數據庫和UI?

David Hefferman告訴我,在VCL中創建的動畫GIF即使在線程中也不會響應,因爲VCL位於主線程中,並且數據庫也是如此。

這裏我懷疑如何使用線程,特別是在數據庫中,所以我有很多關於它的問題。

我是否必須在線程函數和過程中實現我的整個數據庫? 如果這是正確的,那麼我不能通過將組件拖放到Form中來使用數據庫,對吧? 但是用戶輸入和網格呢?他們能夠正常使用這些線程,還是必須使用常規TEdit而不是TDBEdit才能將其內容發送到insert/update sql命令?

這裏的主要目標是創建Delphi應用程序,該應用程序使用Zeos訪問像MySQL這樣的遠程數據庫,但對於服務器中所做的每一滴諮詢都不會凍結。至少小一些。如果系統要將記錄列表下載到表中並且用戶仍然可以輸入內容,那將是非常難看的。對於這些情況,我非常希望我的GIF動畫(或其他解決方案)可以工作。

謝謝你的幫助!

+0

恕我直言,問題是廣泛的回答在這裏。 – bummi 2013-03-22 16:46:04

+0

用戶在等待數據庫響應時是否還有其他操作? – 2013-03-22 18:03:06

+0

是的,不要因爲應用程序屏幕變灰而灰心,並且在標題中出現「(無響應)」消息... – PSyLoCKe 2013-03-22 18:10:02

回答

3

根據我的經驗,最好的方法是將數據庫組件放在數據模塊上,然後在每個線程中動態創建此數據模塊。如果數據庫組件在正在使用它們的線程中創建並初始化,它們通常可以正常工作。

但是,有一些警告 - 如果您要連接到Firebird數據庫,則應確保當時只有一個線程正在建立連接。 (在連接到數據庫的代碼周圍使用關鍵部分。)這適用於Firebird 1.5,2.0和2.1,但對於Firebird 2.5可能不再必要(我還沒有機會測試它)。

編輯(回答EASI的評論):是的,連接到數據庫可能需要一些時間。如果您經常需要執行短操作,最好保持線程連接並運行較長時間。

我可以想出兩種方法來做到這一點。 1)保持線程活着並連接並在內部運行消息循環。該循環將接收來自主線程的命令,處理它們並返回結果。 2)保持線程初始化並連接到線程池中,並在需要執行數據庫操作時將其激活。

基本上,兩種方法都是一樣的,區別在於處理'接收和處理命令'循環的級別。

第二種方法可以通過使用IOmniConnectionPool.SetThreadDataFactory機制在OmniThreadLibrary中輕鬆實現。有關更多信息,請參閱Adding connection pool mechanism to OmniThreadLibrary和演示24_ConnectionPool。或者,您可以使用高級抽象Background worker,您可以在Task initialization塊中以每個線程爲基礎建立數據庫連接。

+0

我對此的關注是,如果需要更多時間來訪問數據庫並開始基本操作,例如每次需要使用它時連接到數據庫服務器。我認爲這是使用隨機短期諮詢的一種非常好的方法,但是當數據表單在用戶放置數據併發出「類似Ajax」請求時長時間打開時可以使用嗎? – PSyLoCKe 2013-03-22 17:17:01

+0

不要忘記編寫併發問題。 – 2013-03-22 19:23:48

+1

RemObjects DataAbstract實現了這樣一個連接池,並且內置了一個非常好的多線程系統。 – 2013-03-22 22:58:46

相關問題