加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

如何让Windows认为您的应用程序仍然很忙,尽管它没有响应

发布时间:2020-12-14 01:59:10 所属栏目:Windows 来源:网络整理
导读:我的应用程序是一个窗口应用程序,执行某些复杂的数学算法.因为我很久以前就开始使用该应用程序,所以大多数仍然是单线程的.更确切地说,主线程执行所有复杂的计算逻辑.值得一提的是,在计算过程中,我在屏幕上显示了一些进展. 在大多数情况下,数学算法只需要几秒
我的应用程序是一个窗口应用程序,执行某些复杂的数学算法.因为我很久以前就开始使用该应用程序,所以大多数仍然是单线程的.更确切地说,主线程执行所有复杂的计算逻辑.值得一提的是,在计算过程中,我在屏幕上显示了一些进展.

在大多数情况下,数学算法只需要几秒钟,因此在用户启动操作后,会显示沙漏(或Windows 7中的运行圆圈),几秒钟后会显示结果.

在某些情况下,算法可能需要几分钟.在此期间,我显示了沙漏,当算法繁忙时,我会在窗口中显示进度.但是,如果用户在忙碌一段时间后点击应用程序,则窗口变得“更白”(好像在窗口上放置了一块非完全透明的塑料),窗口不再更新,Windows报告“应用程序没有响应”.

我使用Qt,我使用Qt函数QWidget :: repaint强制重绘,而我的算法很忙.重绘工作了一段时间,但如上所述,Windows似乎在一段时间后阻止了这一点.

告诉Windows您的应用程序是否仍然繁忙以便窗口不断更新的正确方法是什么?如果我进入显式消息循环,用户可能会触发应用程序中我不想要的其他操作.

>打电话给PeekMessage就足够了吗?
>调用GetMessage就足够了?
>或者我应该调用DispatchMessage?如何阻止用户启动另一个操作(实际上,阻止所有用户输入)
>我每次更新窗口时是否应该拨打其中一条消息,或者我可以限制自己每隔几秒钟调用一次(10秒?,30秒?…)

请注意,将计算逻辑移动到单独的线程当前不是一个选项.

我在Windows 7上使用Visual Studio 2010,与Qt 4.7结合使用.

解决方法

您应该将GUI与应用程序逻辑分开.所有其他解决方案都是黑客.使用Qt可以轻松地将计算逻辑移动到单独的线程中.

我假设有一个函数(让我们称之为execute()),当被调用时执行所有这些耗时的数学运算.一种选择是使用Qt Concurrent API在单独的线程中调用此函数,而不使用低级线程处理.

你需要的是QtConcurrent::run功能:

The QtConcurrent::run() function runs a function in a separate thread.
The return value of the function is made available through the QFuture
API.

而不是简单地调用将阻止用户界面的execute(),您可以执行以下操作(让A成为定义execute()的类):

QFuture<void> future = QtConcurrent::run(this,&A::execute);

您可以使用QFutrureWatcher以获得有关功能何时完成的通知.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读