我的delphi 2009应用程序使用DLL执行一些可能需要几秒钟的活动。我想展示一个进度条。不幸的是,DLL调用是一个阻塞调用&没有回调功能。
我一直在考虑的方法是在我的应用中添加一个TTimer。当计时器事件触发时,我查看时间并使用它来计算进度%并更新进度条。
我这样做了,我对VCL不是线程安全的事实有疑问吗?
谢谢你!答案 0 :(得分:2)
我对Delphi了解不多,但如果它在Windows上运行,你可能需要这样做。
1)因为您的用户界面不是线程安全的,所以您需要将PostMessage放入用户界面线程以更新进度条。
2)如果你的用户界面线程是调用DLL的线程,那么你不会抽取消息,所以你不能更新你的用户界面。您可以调用MsgWaitForMultipleObjectsEx在等待时继续传送消息,但由于等待在DLL内,因此您没有等待的句柄。是否可以将您的调用移动到另一个线程?然后你可以等待那个线程句柄。这样您的进度条将继续运行。
我不太了解Delphi,但是我的同事告诉我它运行基于Win32的函数调用,所以它的操作非常像windows上的windows程序。
答案 1 :(得分:1)
由于DLL阻塞,您需要从辅助工作线程调用它。如果您在主线程中调用它,您的TTimer将被阻止,因此无法更新UI。