首页 理论教育 单线程程序的不足和解决方法

单线程程序的不足和解决方法

时间:2023-11-16 理论教育 版权反馈
【摘要】:不妨设过程A耗时约2min,则用户将会发现在过程A的执行期间应用程序基本上不响应各种用户或系统消息,其用户界面不会得到更新。图5-1应用程序界面图5-2不完整的对话框这种情况和我们以前遇到的应用程序崩溃类似,但实际上该应用程序正在按部就班地运行,并没有任何差错。图5-3Windows应用程序与操作系统之间的关系读者可以看到,在WndProc()窗口过程中有一个switch—case结构,用来判别消息的类型,并调用相应的消息响应函数。

单线程程序的不足和解决方法

考虑一个基于对话框的简单应用程序,其界面如图5-1所示,因为该实例过于简单,我们没有给出编写过程。

为了抓住核心,清楚地说明问题,上面这个基于对话框的应用程序已经被高度简化了,见图5-1。按下“开始”按钮,将启动一个十分耗时的处理过程(例如笔者所开发的求解大规模组合优化的计算过程),我们将它称为过程A,在本实例中将调用Win32 API 函数Sleep()来模拟它。不妨设过程A耗时约2min,则用户将会发现在过程A的执行期间应用程序基本上不响应各种用户或系统消息,其用户界面不会得到更新。例如,当上述对话框被其它窗口覆盖住左下角后,对话框变成了如图5-2所示的不完整形式。

图5-1 应用程序界面

图5-2 不完整的对话框

这种情况和我们以前遇到的应用程序崩溃类似,但实际上该应用程序正在按部就班地运行,并没有任何差错。那么上述问题出现的原因在哪儿呢?如何解决呢?首先让我们来看一下Windows的消息处理机制,如图5-3所示。(www.xing528.com)

用MFC开发的源程序中是找不到上述代码的,列出上述与其等价的Win32 API代码只是为了说明上述实例的运行机制,更清晰地说明存在的问题。

在图5-3给出的代码中,函数GetMessage()获得应用程序消息队列中的消息,并在获得消息后返回,否则等待。DispatchMessage()将所获得的消息分发给该消息的目的窗口过程WndProc(),并在该消息被处理完毕后返回。

图5-3 Windows应用程序与操作系统之间的关系

读者可以看到,在WndProc()窗口过程中有一个switch—case结构,用来判别消息的类型,并调用相应的消息响应函数。当用户按下“开始”按钮后,WM_COMMAND连同其有关的参数被发送给WndProc()窗口过程,通过switch语句判断出该消息是由“开始”按钮所发出的,则调用处理过程A。在过程A自然结束前,WndProc()窗口过程是不会返回的,也就是上面代码中的DispatchMessage()不会返回,这样WinMain()函数中的while循环语句就无法执行下一步循环,这就导致了应用程序无法获取消息队列中的下一条消息,也就无法对其它操作做出响应。这样便出现了前面基于对话框的程序无法更新用户界面的情况。究其原因,最根本的一点就是例子中的每一个进程只有一个程序计数器和执行控制流程。对于这个问题,有多种解决方案,其中我们将要涉及到的话题——多线程编程——就是其中的一种较好的解决方案。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈