多年来,一位同事一直在使用一个自定义的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方法进行进度回调。回调函数提供当前操作的进度(百分比)和通过函数的返回值取消操作的方法。所以整个问题都是无意义的;回调函数可以用来更新进度条,它向用户指示应用程序没有挂起。