【问题标题】:need to add a progress bar for when a (blocking) DLL call is busy需要为(阻塞)DLL 调用忙时添加进度条
【发布时间】:2009-10-23 00:20:04
【问题描述】:

我的 delphi 2009 应用程序使用一个 DLL,它执行一些可能需要几秒钟的活动。我想显示一个进度条。不幸的是,DLL 调用是一个阻塞调用并且没有回调函数。

我一直在考虑的一种方法是将 TTimer 添加到我的应用程序中。当计时器事件触发时,我会查看时间并使用它来计算进度百分比并更新进度条。

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

谢谢!

【问题讨论】:

  • 您的问题到底是什么?我无法从接受的答案中看出......是“如果我这样做了,我会......”还是“我这样做了,我会......”。无论如何,如果不从辅助线程调用 DLL 或从 DLL 进行合作,它就无法完成,所以我不知道为什么你已经接受了答案。问题是什么,答案是什么,为什么?非常令人费解。

标签: delphi


【解决方案1】:

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

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

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

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

【讨论】:

  • 不仅仅是“非常像”Windows 上的一个 Windows 程序——它是一个原生 Win32 Windows 程序(就像它是用 VS C++ 编写的一样)。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-29
    • 2015-10-13
    • 1970-01-01
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 2013-07-29
    相关资源
    最近更新 更多