2009-10-23 61 views
0

我的delphi 2009應用程序使用一個DLL來執行一些可能需要幾秒鐘的活動。我想展示一個進度條。不幸的是DLL調用是阻塞調用&沒有回調函數。需要爲(阻塞)DLL調用忙時添加進度條

我一直在考慮的一種方式是添加TTimer到我的應用程序。當計時器事件觸發時,我會查看時間並使用它計算進度百分比並更新進度條。

我這樣做,我會有問題的事實,即VCL是不是線程安全的?

謝謝!

+0

你的問題到底是什麼?我無法從接受的答案中看出......是「如果我這樣做了,我會......」還是「我做到了,我會......」。在任何情況下,如果沒有從輔助線程調用DLL或者無法與DLL進行合作,那麼我不知道爲什麼你已經接受了答案。問題是什麼,它的答案是什麼,爲什麼?非常令人費解。 – mghie 2009-10-23 04:05:57

回答

2

我不太瞭解Delphi,但如果它在Windows上運行,則可能需要執行此操作。

1)由於您的用戶界面不是線程安全的,您需要將PostMessage導入用戶界面線程以更新進度欄。 2)如果你的用戶界面線程是調用DLL的線程,那麼你不會抽出消息,所以你不能更新你的用戶界面。您可以調用MsgWaitForMultipleObjectsEx在等待期間繼續泵送消息,但由於等待在DLL內,因此您沒有等待的句柄。是否有可能將你的調用移動到另一個線程的DLL?然後,您可以等待該線程句柄。這樣你的進度條將繼續運行。

我不太瞭解Delphi,但我的同事告訴我它運行基於Win32的函數調用,所以它的運行非常像Windows上的Windows程序。

+0

我忘了這個選項。謝謝! – 2009-10-23 00:59:52

+2

不僅僅是「非常喜歡」Windows上的Windows程序 - 它是一個原生的Win32 Windows程序(就像它在VS C++中編寫一樣)。 – 2009-10-23 01:31:16

1

由於DLL被阻塞,你需要從輔助工作者線程調用它。如果你在主線程中調用它,你的TTimer將被阻塞,從而無法更新UI。