優秀的數據庫應用應當充分考慮數據庫訪問的速度問題。通常可以通過優化數據庫、優化 查詢語句、分頁查詢等途徑收到明顯的效果。即使是這樣,也不可避免地會在查詢時閃現一個帶有 SQL符號的沙漏,即鼠標變成了查詢等待。最可憐的是用戶,他(她)在此時只能無奈地等待。遇到急性子的,干脆在此時嘗試 Windows中的其它應用程序,結果致使你的數據庫應用顯示一大片白色的窗口。真是無奈!
本文將以簡單的例子告訴你如何實現線程查詢。還等什麼,趕快打開Delphi對照著下面的完整源代碼試試吧。
在查詢時能夠做別的事情或者取消查詢,這只是基本的線程查詢,在你閱讀了Delphi有關線程幫助之後能立刻實現。這裡介紹的是多個線程查詢的同步進行。
在Delphi數據庫應用中,都有一個缺省的數據庫會話 Session。通常情況下,每個數據庫應用中只有這一個會話。無論是查詢函數修改數據,在同一時間內只能進行其中的一件事情, 而且進行這一件事情的時候應用程序不能響應鍵盤、鼠標以及其它的 Windows消息。這就是在 窗口區域會顯示一片空白的原因所在。當然,只要將查詢或數據操縱構造成線程對象,情況會好一些,至少可以接受窗口消息,也可以隨時終止查詢或數據操縱,而不會在屏幕上顯示出太難看的白色。不過,這只是解決了問題的一部分。假如在進行一個線程查詢的時候,用戶通過 按鈕或菜單又發出了另一個查詢的命令,這可如何是好,難道終止正在執行的數據庫訪問嗎? 解決之道就是:多線程同步查詢。
實現多線程同步查詢的基本思想是,為每一個查詢組件(如TQuery組件)創建一個獨占的 數據庫會話,然後各自進行數據庫訪問。需要特別注意的是,因為Delphi中的 VCL組件大多都 不是線程安全的,所以應當在線程查詢結束後再將DataSource組件與查詢組件關聯,從而顯示 在DBGrid組件中。
下面的例子只實現了靜態的線程同步查詢,即線程對象是固定的,並隨窗體的創建和銷毀 而創建和銷毀。你可以就此進行改進,為每一個數據查詢或數據操縱命令創建一個單獨的線程對象,從而達到多線程同步查詢的目的。
注意:應用程序中的線程不是越多越好,因為線程將嚴重吞噬CPU資源,盡管看上去並不明顯。謹慎創建和銷毀線程將避免你的應用程序導致系統資源崩潰。
下面的例子給出了同時進行的兩個線程查詢。第一次按下按鈕時,線程開始執行;以後每次按下按鈕時,如果線程處於掛起狀態則繼續執行,否則掛起線程;線程執行完畢之後將連接 DataSource,查詢結果將顯示在相應的DBGrid中。