c#用show第二个窗体卡死如何解决

c#用show第二个窗体卡死如何解决,第1张

c#用show第二个窗体卡死如何解决

本文是对窗口卡死(假死)的应用问题进行一系列的探讨,旨在帮助对Windows应用程序不熟悉的新手理解这个问题。我将逐步的深入开发的过程,让你有一个循序渐进的思路。我这里就用MFC程序作为示例,当然win32程序或者C#等都可以实现,这里主要是做一个参考。一般来说,我们点击了一个按钮,就触发了一个动作,这个动作就可以执行一系列的功能。但是有的功能可能会耗时很久,比如下载文件,或者读写文件等。此时窗口界面就无法再响应我们的 *** 作了,然后就出现了窗口提示“未响应”。实际上窗口程序在执行功能,并没有死掉,所以也叫作假死。我们一般也将这样的情况叫做卡死。发生未响应的假死状态,是因为当一个窗口事件执行的太久的时候,你后续的 *** 作来不及处理,所以就无法响应了。这样的现象会导致体验很差。但是多数时候,我们都只是执行一个简单的动作,3秒内都可以完成,很多时候也就懒得进行处理了,耐心一点就是了。但是如果超过了3秒,很多用户就不耐烦了,再 *** 作界面,程序就未响应,然后用户以为程序死掉了,然后就强制关闭了窗口程序,然后就会骂软件做的很烂。如果确实只没有时间去改善,怎么办呢?要么在界面上显示一行文字说明,请等待。但是事先显示在界面上不美观,不显示用户不知道。怎么办呢?而当窗口在执行一系列 *** 作的时候,无法更新界面了,所以设置界面上的控件也是无法更新提示文字了。怎么办呢?下面就这个问题的界面,按照解决问题的思路,一个个给出解决办法。首先是让卡死(假死)的窗口能够更新提示,最好是能够动态的变化的提示。然后最好是不要卡死。如果不卡死,也就是说,尽管要执行的 *** 作还没有完成,也要让界面可以自由的 *** 作。不过这个会引起一个问题,那就是可能会触发更多的误 *** 作,比如又执行了一次功能,或者前面功能没有执行完就点击了后续的功能的执行,会导致程序逻辑的混乱。所以,我们还要对改进了界面体验之后出现的新问题再进行处理。当然,我们会一步步的将解决的办法告诉你的。开始吧!1让卡死的界面依然可以动态更新提示当我们的按钮单击之后,在执行功能,需要耗时10S。在这10S内,我们是无法 *** 作界面了。如果 *** 作,可能就让程序陷入“未响应”的状态。而我们要向改善这个体验,我们可以在进入执行功能时,在界面上动态提示执行的过程,让用户等待,提示执行的进度。默认情况下,我们都是在按钮的命令处理编写功能代码。这样实现很简单。对于大多数不耗时的功能就够了。我们先来写一个模拟耗时10S的功能代码,代码如下:Ct1Dlg::OnBnClickedOk()

{

(i=0;i<10;i++)

{

Sleep(1000);

}

}

当你点击按钮的时候,就会睡眠10秒,表示内部执行了10秒的时间长度。此时界面就无法响应用户的 *** 作了。然而此时却在界面看不到任何的提示。所以我们要想办法将动态的提示显示到界面上。前面分析说了,控件是没有办法更新内容的,因为此时正在执行按钮消息WM_COMMAND。这个消息处理不执行完,不会去执行其他消息的处理的。因为窗口界面消息的处理是在一个线程中的,默认的就是主线程。主线程在执行内部的功能,所以界面就会卡死。当主线程把内部功能执行完了,就会继续处理其他的消息,你就看到你 *** 作的界面有反应了。

写的都是阻塞的,不过应该影响不大。

由于监控下位机有个心跳数据需要取,所以每一秒发一条命令然后受到状态更新界面上一个CStatic。

现在,MFC程序刚刚启动时还好,资源管理器显示平均CPU占有12左右;

不过,啥也不干,就那么放着,一个小时左右后整个电脑都开始卡,这时显示平均CPU占用5左右。到后来,干脆整个程序界面都卡死了,就是Ctrl+Tab回不来了。但是至少后台在打印txt日志的行程还在运行。

从资源管理器来看,平均%5的CPU也不是很夸张啊,但为啥就界面卡死了呢?

而且刚刚运行的时候不是很卡,时间久了就卡了,是啥东西比如句柄用完了没释放导致的吗?

以上就是关于c#用show第二个窗体卡死如何解决全部的内容,包括:c#用show第二个窗体卡死如何解决、咱写了个MFC读写串口的程序,但是越来越卡,可能是啥原因、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10096300.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存