我正在看一个3.0版本的主要单线程的windows forms应用程序。最近,我的老板在一个单独的线程上添加了一个进度对话框,这样当主线程离开并执行一些繁重的工作并锁定GUI时,用户将看到一些活动。
除非用户切换应用程序或最小化,否则上面的效果很好,因为进度窗体位于最上面,不会随主应用程序一起消失。如果有许多小操作,这并不是那么糟糕,因为主窗体的事件结构在获得时间时会赶上它的事件,因此可以检查最小化和活动标志,从而对话线程可以相应地隐藏或显示自己。
但是,如果启动一个长时间运行的sql操作,则不会触发任何事件。我尝试过拦截WndProc命令,但是当一个长时间运行的sql操作正在执行时,它也显示为排队。我也尝试过选择进程,找到当前的应用程序,并检查进程线程中的各种内存值等,但在sql操作完成之前,这些都不会更新。当另一个应用程序激活时,移除最上面的应用程序会导致对话框消失,但如果主应用程序随后被取回,它将不会再次出现。
因此,我需要一种方法来找出另一个线程是否已最小化或不再活动,而不需要查询实际的线程,因为在sql操作完成之前,该线程会被锁定。
现在我知道这不是写这篇文章的最好方式,最好把所有繁重的处理放在单独的线程上,让GUI自由运行,但由于这是一个巨大的古老的遗留应用程序,不会提供以这种方式重写的时间,所以我必须使用我得到的东西。
任何帮助我们都将不胜感激
发布于 2010-04-15 23:37:33
听起来好像长时间运行的操作绑定到了进度对话框中?这通常是一个糟糕的想法,我想知道进展是否能显示出来。
但是,对于长时间运行的操作,您应该考虑使用BackgroundWorker。因此您的GUI (主窗体和进度对话框保持活动状态)。
这样,您应该能够将主窗体的最小化事件发送到进度对话框中,该对话框可以立即对其做出反应。
顺便说一句。BackgroundWorker支持自己的进度报告。
https://stackoverflow.com/questions/2646665
复制相似问题