代码之家  ›  专栏  ›  技术社区  ›  Ken White

启用主题的Windows XP/Vista中的t iMate无法工作

  •  -8
  • Ken White  · 技术社区  · 15 年前

    多年来,一位同事一直在使用一个自定义的AVI来指示在一些较长的操作过程中的进展。它总是工作得很好。

    最近,他决定从Delphi7转到Delphi2007,部分原因是为了获得应用程序的主题支持。(我们最终让大多数人(但不是所有人)在XP上运行。)动画停止工作。禁用主题会使其再次工作。

    tanimate是一个围绕Windows动画控件的包装器,使用initCommonControlSex(icc_animate_类)创建。msdn文档指出,“如果您使用的是comctl32.dll版本6,则不支持该线程,因此请确保应用程序不会阻塞UI,否则不会发生动画。”显然,这是预期的行为。

    有人对这个问题的解决方案或替代方案有什么建议吗?他试图显示进度的处理本身不适合生成单独的线程,而且由于明显的原因,application.processmessages也不是一个好的解决方案。

    编辑:我授予Rob Kennedy这个问题的正确答案,因为a)他为Raymond Chen关于这个话题的博客帖子提供了“缺失的链接”(双关语是故意的),b)当然,将事情转移到一个单独的线程是正确的答案。

    具有讽刺意味的是:他进行的阻止生命的操作是我们使用的数据库引擎(Advantage数据库服务器,或ADS)的索引操作。他带着这个问题来找我的时候没有提到这个问题。

    ADS支持使用tadsdata.adsRegisterCallbackFunction和tadsdata.adsClearCallbackFunction方法进行进度回调。回调函数提供当前操作的进度(百分比)和通过函数的返回值取消操作的方法。所以整个问题都是无意义的;回调函数可以用来更新进度条,它向用户指示应用程序没有挂起。

    2 回复  |  直到 14 年前
        1
  •  6
  •   Rob Kennedy    15 年前

    Raymond Chen has written about this. 他甚至没有提到我通常认为的线程控制无法正常工作的主要原因,即线程不应该在与不同线程关联的窗口上绘制。

    我鼓励你的同事重新审视那些使他决定不能把任务放到一个单独的线程中的事情。不管是否有动画控件来掩盖非响应性,阻塞主UI线程都不是一个好主意。

        2
  •  1
  •   skamradt    15 年前

    作为线程的替代,您可以使用 AsyncCalls 从功能的角度来看,这为多线程处理提供了一个更简单的入口点。不过,处理这种情况的最佳方法是在后台执行长过程,以保持应用程序的响应性。