2009-10-23 65 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。