如何让Windows认为您的应用程序仍然很忙,尽管它没有响应
我的应用程序是一个窗口应用程序,执行某些复杂的数学算法.因为我很久以前就开始使用该应用程序,所以大多数仍然是单线程的.更确切地说,主线程执行所有复杂的计算逻辑.值得一提的是,在计算过程中,我在屏幕上显示了一些进展.
在大多数情况下,数学算法只需要几秒钟,因此在用户启动操作后,会显示沙漏(或Windows 7中的运行圆圈),几秒钟后会显示结果. 在某些情况下,算法可能需要几分钟.在此期间,我显示了沙漏,当算法繁忙时,我会在窗口中显示进度.但是,如果用户在忙碌一段时间后点击应用程序,则窗口变得“更白”(好像在窗口上放置了一块非完全透明的塑料),窗口不再更新,Windows报告“应用程序没有响应”. 我使用Qt,我使用Qt函数QWidget :: repaint强制重绘,而我的算法很忙.重绘工作了一段时间,但如上所述,Windows似乎在一段时间后阻止了这一点. 告诉Windows您的应用程序是否仍然繁忙以便窗口不断更新的正确方法是什么?如果我进入显式消息循环,用户可能会触发应用程序中我不想要的其他操作. >打电话给PeekMessage就足够了吗? 请注意,将计算逻辑移动到单独的线程当前不是一个选项. 我在Windows 7上使用Visual Studio 2010,与Qt 4.7结合使用. 解决方法
您应该将GUI与应用程序逻辑分开.所有其他解决方案都是黑客.使用Qt可以轻松地将计算逻辑移动到单独的线程中.
我假设有一个函数(让我们称之为execute()),当被调用时执行所有这些耗时的数学运算.一种选择是使用Qt Concurrent API在单独的线程中调用此函数,而不使用低级线程处理. 你需要的是
而不是简单地调用将阻止用户界面的execute(),您可以执行以下操作(让A成为定义execute()的类): QFuture<void> future = QtConcurrent::run(this,&A::execute); 您可以使用 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- entity-framework – 我可以在Windows Phone 8上使用Entity
- Windows server 2016 搭建DHCP服务器
- windows-server-2008 – 最快的复制文件的方法
- windows-7 – 如何在UAC对话框中控制应用程序的名称?
- SSH客户端在Windows 7下定期冻结
- Windows安装MySQL
- Windows资源管理器 – 将文件列表从Windows资源管理器复制为
- windows-server-2008 – 删除了不会联机的群集磁盘,现在它想
- 是否可以使用PowerShell创建用于安装Windows功能的通用配置
- windows-7 – 登台新计算机的最佳方式 – 以没有密码的用户
- LeetCode-239 Sliding Window Maximum
- 窗口 – 如果条件在批处理文件
- Windows 2008 IIS 7 ASP.NET 写入 Event Log 发生
- windows-server-2008-r2 – 查找哪个网络连接属于
- windows-server-2008 – 如果/ bin更改,我可以阻
- windows-phone-8.1 – 如何以编程方式检查Window
- 如何在Metro XAML中定义隐式数据模板?
- windows – CreateThread vs fork()
- windows-8 – 在Win8和WP8应用程序中共享静态库
- Windows控制台 – BAT兼容性