我有一個使用專有數據集訪問數據庫的控件。該數據庫是一箇舊的ISAM基礎數據庫。
該控件使用後臺線程使用專有數據集查詢數據庫。
一個表單上會有幾個這樣的控件,每個控件都使用它們自己的線程訪問數據,因爲它們都需要同時加載。
專有數據集通過顯示VCL TForm處理併發性,通知用戶正在打開的表已被其他用戶鎖定,並且數據集正在等待鎖釋放。
表單上有一個取消按鈕,讓用戶取消鎖定等待。
問題:
當使用專有的數據集從一個線程中,應用程序將崩潰,掛起或給予一定的錯誤,如果鎖等待的形式,它顯示出來。我懷疑這是與VCL不是線程安全的。
我已經通過同步Dataset.Open解決了這個問題,但是這會阻塞主線程直到dataset.open返回,這可能會花費大量的時間,具體取決於查詢的複雜程度。
我已經顯示了一個模態進度條,它可以讓用戶知道它正在發生的事情,但我不喜歡這個想法,因爲用戶將會等待進度條完成。
專有數據集代碼被編譯到主應用程序中,即它沒有存儲在單獨的DLL中。我們不允許在開發過程的這個階段改變鎖定的工作方式或是否顯示錶單,因爲我們太接近發佈了。
理想情況下,我想讓Dataset.open在控制線程中運行,而不是使用主線程,但這似乎不太可能工作。
其他人可以提出解決辦法嗎?請。
你的問題是沒有意義的我。要在單獨的過程中創建控件,請將其放入單獨的應用程序中。與線程相比,纖維對於VCL的使用並不安全。目前還不清楚爲什麼ISAM數據庫的鎖定信息會成爲問題;它是否直接使用VCL?如果是這樣,怎麼樣? – 2011-03-19 23:57:06
我只是想知道,如果它是可能有,在一個單獨的過程,但另一個進程的形式顯示運行,要做到這一點,而無需一個單獨的可執行的控制。 ISAM數據集組件顯示鎖定消息,該消息基本上是一個帶有取消按鈕的TForm。鎖定消息通知用戶正在打開的表格當前被另一個用戶鎖定。用戶然後可以選擇等待或按取消按鈕。它的代碼來自爲什麼在DOS日期移植到Windows以及我無法改變的東西。 – 2011-03-20 09:23:21
有可能讓來自不同進程的UI出現在單個父容器內。考慮Chrome或IE8。我沒有看到你需要這樣做。您可以在後臺線程中使用UI,只要該UI完全隔離即可。如果這個其他代碼是作爲DLL提供的,那麼我不明白爲什麼你有問題。 – 2011-03-20 10:51:35