2011-03-19 61 views
0

德爾福 - 創建一個在其自己的進程中運行的控件

我有一個使用專有數據集訪問數據庫的控件。該數據庫是一箇舊的ISAM基礎數據庫。

該控件使用後臺線程使用專有數據集查詢數據庫。

一個表單上會有幾個這樣的控件,每個控件都使用它們自己的線程訪問數據,因爲它們都需要同時加載。

專有數據集通過顯示VCL TForm處理併發性,通知用戶正在打開的表已被其他用戶鎖定,並且數據集正在等待鎖釋放。

表單上有一個取消按鈕,讓用戶取消鎖定等待。

問題:

當使用專有的數據集從一個線程中,應用程序將崩潰,掛起或給予一定的錯誤,如果鎖等待的形式,它顯示出來。我懷疑這是與VCL不是線程安全的。

我已經通過同步Dataset.Open解決了這個問題,但是這會阻塞主線程直到dataset.open返回,這可能會花費大量的時間,具體取決於查詢的複雜程度。

我已經顯示了一個模態進度條,它可以讓用戶知道它正在發生的事情,但我不喜歡這個想法,因爲用戶將會等待進度條完成。

專有數據集代碼被編譯到主應用程序中,即它沒有存儲在單獨的DLL中。我們不允許在開發過程的這個階段改變鎖定的工作方式或是否顯示錶單,因爲我們太接近發佈了。

理想情況下,我想讓Dataset.open在控制線程中運行,而不是使用主線程,但這似乎不太可能工作。

其他人可以提出解決辦法嗎?請。

+2

你的問題是沒有意義的我。要在單獨的過程中創建控件,請將其放入單獨的應用程序中。與線程相比,纖維對於VCL的使用並不安全。目前還不清楚爲什麼ISAM數據庫的鎖定信息會成爲問題;它是否直接使用VCL?如果是這樣,怎麼樣? – 2011-03-19 23:57:06

+0

我只是想知道,如果它是可能有,在一個單獨的過程,但另一個進程的形式顯示運行,要做到這一點,而無需一個單獨的可執行的控制。 ISAM數據集組件顯示鎖定消息,該消息基本上是一個帶有取消按鈕的TForm。鎖定消息通知用戶正在打開的表格當前被另一個用戶鎖定。用戶然後可以選擇等待或按取消按鈕。它的代碼來自爲什麼在DOS日期移植到Windows以及我無法改變的東西。 – 2011-03-20 09:23:21

+0

有可能讓來自不同進程的UI出現在單個父容器內。考慮Chrome或IE8。我沒有看到你需要這樣做。您可以在後臺線程中使用UI,只要該UI完全隔離即可。如果這個其他代碼是作爲DLL提供的,那麼我不明白爲什麼你有問題。 – 2011-03-20 10:51:35

回答

1

纖維不會幫助你一點,因爲它們都在Windows API中,專門用於幫助輕鬆移植使用合作多任務編寫的舊代碼。光纖基本上是一種協同例程,它們都在相同的進程中執行,有自己的堆棧空間,它們之間的切換由用戶代碼而不是操作系統來控制。這意味着它們之間的切換隻能在安全的時候發生,所以沒有同步問題。 OTOH意味着同一時刻只能在一個線程內運行一根光纖,因此使用具有阻止代碼的光纖具有與在一個線程內調用阻止代碼相同的特性 - 應用程序無響應。

您可以將纖維與多個線程一起使用,但這可能很危險,並且與單獨使用線程相比不會帶來任何好處。

我在VCL應用程序中成功地使用了光纖,但僅用於特定目的。如果您想要處理潛在的阻止代碼,請忘記它們。

至於你的問題 - 你應該做的是僅用於顯示目的的控制,並使用標準的進程間通信機制來與訪問數據庫另一個進程交換數據。

+0

對不起,我不明白你的意思是與另一個訪問數據庫的進程交換數據?你的意思是創建另一個進程訪問數據庫並使用WM_COPYDATA傳遞數據包(抱歉,我不記得該消息被稱爲什麼)?這可以做到沒有一個單獨的可執行文件?有點像創建一個虛擬的過程,並在運行一些代碼附加一個線程吧.. – 2011-03-20 09:30:13

+0

@no勺:你問到在其自己的進程中運行的控制。一個進程必須有一個可執行文件 - 可以是相同的,也可以是不同的。如果你生成同一個可執行文件的另一個實例(也許使用命令行開關),那麼你將不需要另一個。然而,所有這些與纖維無關。你應該澄清你的問題。 – mghie 2011-03-20 11:28:49

+0

對於任何人誰不明白爲什麼這似乎這麼做完全風馬牛不相及的問題:未經編輯的問題被標記纖維,特別對他們問作爲一個可能的解決方案。我會留下答案,因爲似乎有很多關於纖維的誤解。注意:與VCL一起使用時,它們不是不安全或危險的。 – mghie 2011-03-21 08:38:57

0

COM對象可以運行在外的處理模式。可能在delphi中使用它們會更容易一些,然後再使用另一個IPC機制。