需要为(阻塞)DLL调用忙时添加进度条

时间:2009-10-23 00:20:04

标签: delphi

我的delphi 2009应用程序使用DL​​L执行一些可能需要几秒钟的活动。我想展示一个进度条。不幸的是,DLL调用是一个阻塞调用&没有回调功能。

我一直在考虑的方法是在我的应用中添加一个TTimer。当计时器事件触发时,我查看时间并使用它来计算进度%并更新进度条。

我这样做了,我对VCL不是线程安全的事实有疑问吗?

谢谢你!

2 个答案:

答案 0 :(得分:2)

我对Delphi了解不多,但如果它在Windows上运行,你可能需要这样做。

1)因为您的用户界面不是线程安全的,所以您需要将PostMessage放入用户界面线程以更新进度条。

2)如果你的用户界面线程是调用DLL的线程,那么你不会抽取消息,所以你不能更新你的用户界面。您可以调用MsgWaitForMultipleObjectsEx在等待时继续传送消息,但由于等待在DLL内,因此您没有等待的句柄。是否可以将您的调用移动到另一个线程?然后你可以等待那个线程句柄。这样您的进度条将继续运行。

我不太了解Delphi,但是我的同事告诉我它运行基于Win32的函数调用,所以它的操作非常像windows上的windows程序。

答案 1 :(得分:1)

由于DLL阻塞,您需要从辅助工作线程调用它。如果您在主线程中调用它,您的TTimer将被阻止,因此无法更新UI。