如何让GUI事件屈服于给定的线程?通过GUI事件我的意思是打开子表单,选择不同的选项卡,或最小化/最大化我的表单或更改焦点。
当我的工作线程获取数据时,我可以将资源限制到它,并从我的应用程序中的其他进程或线程中拒绝这些资源吗?
历史:
在我的问题Here中,我解释了一个场景,我关注我的主要表单调用,导致我的关键线程挂起。然后向我透露,我可以选择“BeginInvoke”。
现在我发现虽然BeginInvoke让我在那里中途,我仍然无法避免我的关键线程中的挂起。当我说“关键线程”时,我指的是一个需要大约60ms才能循环的线程,但必须在130ms之前完成循环。它坐在那里循环,轮询数据列表。当数据显示时,通常需要40到60ms才能完成处理。
我 (技术上,我打算恢复)第二个线程在我的表单中抛出BeginInvokes来更新用户运行状态。我目前,出于调试目的,我没有这样做。
我做了一些分析,我注意到我几乎总是将处理时间保持在100ms以下,这是我需要的,因为我的应用程序需要在下一个数据包出现时(每100ms)输出结果,但是对于这个例子,我把它减慢到130ms)。当我与表单交互时,通过更改焦点或最小化/最大化它,我可以看到我的处理时间高于1秒。我认为这是因为愚蠢的事情,如最小化或最大化,或其他重新绘制事件,正在掠夺我所有宝贵的时钟时间。
平台:
我正在使用Visual C#2008和WinForms。目标计算机运行Windows XP。我试图关闭Windows资源管理器,并在Normal,High和Realtime上运行我的应用程序优先级,但在操作表单时我仍然看到几乎相同的影响。
修改 我试图在工作循环期间的关键时刻使用Thread.CurrentThread.Priority来限制我的优先级。这在某种程度上无法从我的GUI中获取这些资源,并且涉及重绘GUI的操作仍然统治着我糟糕的工作线程。
答案 0 :(得分:1)
您是否尝试使用Thread.Priority属性将工作类的线程优先级设置为RealTime?
根据Scheduling Priorities的描述,这应该为您的工作线程提供更高的优先级。但是,这会导致GUI断断续续,因此您可能只想在关键时间段内将优先级设置为高。