精华内容
下载资源
问答
  • 如何防止QT程序未响应

    千次阅读 2018-03-05 23:41:22
    偶尔会执行一些可能很费时的代码,比如进行大规模的数据运算,生成或者拷贝文件,网络请求等,这些操作如果放在UI线程去做,一些操作,比如多点几次鼠标,或者是切换到其他程序再切换回来, 都很容易就会导致程序未响应,...

           在日常的开发中,偶尔会执行一些可能很费时的代码,比如进行大规模的数据运算,生成或者拷贝文件,网络请求等,这些操作如果放在UI线程去做,一些操作,比如多点几次鼠标,或者是切换到其他程序再切换回来, 都很容易就会导致程序未响应,这是由于ui线程正在执行代码或者被阻塞住了,导致没法处理事件循环,系统认为你这个程序可能挂掉了,就会出现那个未响应提示,然后弹窗问用户,要不要强制干掉这个程序.

            优秀的软件这方面都会处理得比较好,会给出一些进度条之类的,而在这方面我最赞赏的就是Android,它会禁止你在ui线程里面做费时操作,比如网络请求,一在ui线程请求网络,立马挂掉,逼着你去实现异步的网络请求,从而保证app的流畅度,早期的Android不会这样的,估计是因为卡顿被骂多了,而开发者又不自觉,不得已才做出这样的限制的吧.Windows没有做出这样的限制,但是也要自觉,避免未响应情况的发生,那么,如何避免呢?

            未响应是由于事件没有及时处理导致的,所以是跟消息循环有关的,那么为了避免未响应,则有两个思路:

            1.程序执行中间,驱动一下事件循环;

            2.费时操作放到子线程,主线程空跑着,消息循环自然没有被阻塞.

            举例说明,比如我们在界面上放了一个按钮,然后按钮的点击事件执行循环运算

    int sum = 0;
    for (int i = 0;i < 100; i++)
    {
        ui.label->setText(QString::number(sum));
        for (int j = 0; j < 1000000000; j++)
        {
            sum+= (i*j) & 3;
        }
        sum += i & 3;
    }

            这个循环会一直占用着cpu,虽然第一层循环会设置label的值,但是在两层循环结束签并不能看到中间结果的显示,而是等循环完了才显示最后的结果(假设放一个进度条,同理,并不能看到进度的变化,而是一直是0%,最后一下子到100%).

            按照第一种思路,我们可以使用QApplication的processEvents方法来进行中间的消息循环驱动,改动代码如下:

    int sum = 0;
    for (int i = 0; i < 100; i++)
    {
    	ui.label->setText(QString::number(sum));
    	for (int j = 0; j < 1000000000; j++)
    	{
    		sum += (i*j) & 3;
    	}
    	sum += i & 3;
          qApp->processEvents();
    }

            唯一的区别在于第一层的后面加个qApp->processEvents();这个函数就是qt的强制事件驱动,其实它是有参数,接个枚举值,

    enum ProcessEventsFlag {
            AllEvents = 0x00,
            ExcludeUserInputEvents = 0x01,
            ExcludeSocketNotifiers = 0x02,
            WaitForMoreEvents = 0x04,
            X11ExcludeTimers = 0x08,
            EventLoopExec = 0x20,
            DialogExec = 0x40
    };

            默认是AllEvents,也就是驱动所有的事件,这个枚举值在很多的教程里面会推荐使用ExcludeUserInputEvents,对此的解释是说忽略用户的输入,从而避免按钮被点击两次,代码重复执行的类似情况,但是其实使用ExcludeUserInputEvents来达到忽略用户输入的目的并不是一个很好的办法,因为它只是此次事件驱动忽略掉而已,一旦你费时的代码执行完了,它会一次将多次的点击事件传给你,到时候可能就会导致大麻烦,故不推荐使用.正确的做法应该是在按钮点击之后,将其置为不可点击,也就是ui.pushButton->setEnabled(false);而processEvents采用默认的AllEvents的方式,这样pushButton本身就不接受这个点击事件了,而这个事件也被处理了,后期不会造成问题.但是倘若你使用ExcludeUserInputEvents,而循环前将setEnabled(false),循环后设置setEnabled(true);,则会循环后多次触发点击事件,连setEnabled都不起作用了 ,意外不意外,惊喜不惊喜?

            第二种思路,采用子线程,写异步代码会是一个问题,因为按钮按下去以后,等执行完是应该要有个提示,如果分开写,不在一个函数里面会使程序的复杂度变得很高,而且子线程的开辟,传参过去也会是个问题,好在c++11之后,我们有了std:: thread和lambda表达式及std:: condition_variable,这三个的组合,会让我们代码写起来很容易,代码如下:

    int sum = 0;
    ui.pushButton->setEnabled(false);
    std::condition_variable kl_cv;
    std::mutex kl_mtx;
    std::unique_lock <std::mutex> kl_lck(kl_mtx);
    std::thread kl_thread([&]()
    {
    	for (int i = 0; i < 100; i++)
    	{
    		ui.label->setText(QString::number(sum));
    		for (int j = 0; j < 10000000; j++)
    		{
    			sum += (i*j) & 3;
    		}
    		sum += i & 3;
    	}
    	kl_cv.notify_all();
    });
    kl_thread.detach();
    while (kl_cv.wait_for(kl_lck, std::chrono::milliseconds(100)) == std::cv_status::timeout)
    {
    	qApp->processEvents();
    }
    ui.pushButton->setEnabled(true);

             这里面使用了std:: thread来开启了一个新变量,然后使用lambda捕获全部引用,避免了我们一个个手动传参的麻烦事,最后使用std::condition_variable条件变量的wait_for来进行线程控制,每过100毫秒就进行一次事件驱动,跑起来后,很顺滑,完美!

             但是,这么多代码,难得每次都要重新写一次么?这样写起来也比较麻烦,那就把它写成两个宏吧,写完后代码简洁不少:

    #define KeepLiveBegin {std::condition_variable kl_cv;std::mutex kl_mtx;std::unique_lock <std::mutex> kl_lck(kl_mtx);\
    		std::thread kl_thread([&](){kl_mtx.lock(); kl_mtx.unlock();
    #define KeepLiveEnd	kl_cv.notify_all();});kl_thread.detach(); \
    		while (kl_cv.wait_for(kl_lck, std::chrono::milliseconds(100)) == std::cv_status::timeout){qApp->processEvents();}}
    
    int sum = 0;
    ui.pushButton->setEnabled(false);
    KeepLiveBegin
    for (int i = 0; i < 100; i++)
    {
    	ui.label->setText(QString::number(sum));
    	for (int j = 0; j < 10000000; j++)
    	{
    		sum += (i*j) & 3;
    	}
    	sum += i & 3;
    }
    KeepLiveEnd
    ui.pushButton->setEnabled(true);

            样比之前,仅仅多了两行宏定义,使用起来也方便不少.

            不过, setEnabled仍然看起来不舒服,如果界面上有很多的按钮,都要来一遍也不好维护,有个好办法可以很优雅地进行拦截,那就是使用事件过滤器,尤其是对QAppliction使用事件过滤器,能起到全局过滤的效果,我实现的代码如下:

    class IgnoreEvent :public QObject
    {
    public:
    	IgnoreEvent(QObject* obj=qApp)
    	{
    		m_obj = obj;
    		m_obj->installEventFilter(this);
    	}
    	~IgnoreEvent()
    	{
    		m_obj->removeEventFilter(this);
    	}
    	bool eventFilter(QObject *obj, QEvent *event)
    	{
    		if (event->type() == QEvent::KeyPress || event->type() == QEvent::MouseButtonPress)
    		{
    			event->ignore();
    			return true;
    		}
    		return QObject::eventFilter(obj, event);
    	}
    private:
    	QObject* m_obj;
    };

            然后点击事件的代码为

    int sum = 0;
    IgnoreEvent ignore;
    KeepLiveBegin
    for (int i = 0; i < 100; i++)
    {
    	ui.label->setText(QString::number(sum));
    	for (int j = 0; j < 10000000; j++)
    	{
    		sum += (i*j) & 3;
    	}
    	sum += i & 3;
    }
    KeepLiveEnd

            相比于之前,去掉了setEnable 然后声明了IgnoreEventignore; IgnoreEvent类最主要的是installEventFilter和removeEventFilter,这里全局过滤掉了键盘的按键操作和鼠标的点击操作.也可以过滤特定界面的事件,当然也可以把这个写进宏定义里面,代码就会更简洁了.

            最后,完整代码如下:

    #include <thread>
    #include <mutex>
    #include <condition_variable>
    
    #define KeepLiveBegin(ignoreevent) {IgnoreEvent* kl_ie =NULL; if(ignoreevent)kl_ie = new IgnoreEvent(); std::condition_variable kl_cv;std::mutex kl_mtx;std::unique_lock <std::mutex> kl_lck(kl_mtx);\
    		std::thread kl_thread([&](){kl_mtx.lock(); kl_mtx.unlock();
    
    #define KeepLiveEnd	kl_cv.notify_all();});kl_thread.detach(); \
    		while (kl_cv.wait_for(kl_lck, std::chrono::milliseconds(100)) == std::cv_status::timeout){qApp->processEvents();}if(kl_ie!=NULL) delete kl_ie;}
    
    class IgnoreEvent :public QObject
    {
    public:
    	IgnoreEvent(QObject* obj=qApp)
    	{
    		m_obj = obj;
    		m_obj->installEventFilter(this);
    	}
    	~IgnoreEvent()
    	{
    		m_obj->removeEventFilter(this);
    	}
    	bool eventFilter(QObject *obj, QEvent *event)
    	{
    		if (event->type() == QEvent::KeyPress || event->type() == QEvent::MouseButtonPress)
    		{
    			event->ignore();
    			return true;
    		}
    		return QObject::eventFilter(obj, event);
    	}
    private:
    	QObject* m_obj;
    };
    
    KeepLiveTest::KeepLiveTest(QWidget *parent)
    	: QMainWindow(parent)
    {
    	ui.setupUi(this);
    	connect(ui.pushButton, &QPushButton::clicked, [this](){
    		int sum = 0;
    		KeepLiveBegin(true)
    		for (int i = 0; i < 100; i++)
    		{
    			ui.label->setText(QString::number(sum));
    			for (int j = 0; j < 10000000; j++)
    			{
    				sum += (i*j) & 3;
    			}
    			sum += i & 3;
    		}
    		KeepLiveEnd
    	});
    }

     


    展开全文
  • 我们在使用电脑的时候,总会遇到程序一直显示未响应、卡顿崩溃的情况,等着浪费时间,却又不知道怎么办。下面就由 好系统重装助手 以 win10系统 为例,来为大家讲解一下如何强制关...

    我们在使用电脑的时候,总会遇到程序一直显示未响应、卡顿崩溃的情况,等着浪费时间,却又不知道怎么办。下面就由 好系统重装助手 win10系统 为例,来为大家讲解一下如何强制关闭未响应程序吧。具体操作步骤如下:

    1、 快捷组合键: Ctrl+Alt+Delete;或者组合键:win+R,输入   taskmgr 命令后回车,打开任务管理器;

    win10系统怎样强制关闭未响应程序

    2、 进入任务管理器后,例如想要关闭 360浏览器医生,就点击一下,然后再点一下右下角的结束任务就可以了。

    win10系统怎样强制关闭未响应程序

     

    操作步骤很简单,大多数人是不知道怎么打开任务管理器,这下就记住了吧,也是一个很实用的一个操作小技巧,希望能够帮到你们。

    本文来源:https://www.yunqisoft.com/news/3YFvU.html


    来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31546655/viewspace-2168674/,如需转载,请注明出处,否则将追究法律责任。

    转载于:http://blog.itpub.net/31546655/viewspace-2168674/

    展开全文
  • 现象:windows启动后,打开了几个程序,之后再打开新的程序发现,都是未响应状态。    处理过程:想先用360杀下毒,但是打开360也是未响应,打开任务管理器,关闭一些已启动的进程,当我关闭WPS进程时,可以正常...

        现象:windows启动后,打开了几个程序,之后再打开新的程序发现,都是未响应状态。

        

        处理过程:想先用360杀下毒,但是打开360也是未响应,打开任务管理器,关闭一些已启动的进程,当我关闭WPS进程时,可以正常启动新的程序了。


        具体导致的操作:我打开了PPT,在弹出了一个WPS热点的右下角图标点右键,想要关闭这个图标,没弹出菜单栏,再启动其它程序就未响应了。


        解决办法:启动任务管理器,手动把所有的WPS进程关掉。


        个人感觉:大公司的免费软件WPS出现这种问题,个人感觉还是不太应该的。

    展开全文
  • Win7程序总是未响应的解决方法

    千次阅读 2013-04-17 11:04:00
    我的笔记本电脑装的是64位WIN7旗舰版系统,前阵子总是有程序在运行时或切换时未响应,比如在玩游戏时切出来之后就切不回去了,到任务管理器一看,未响应了,只能使用任务管理器切回去,或者就强行结束进程再开,这样...

    我的笔记本电脑装的是64位WIN7旗舰版系统,前阵子总是有程序在运行时或切换时未响应,比如在玩游戏时切出来之后就切不回去了,到任务管理器一看,未响应了,只能使用任务管理器切回去,或者就强行结束进程再开,这样让我很是烦躁,但无奈根本没什么WIN7的使用经验,不知道到底是为什么会造成这样的状况。

     

    今天突然想起这事,又有时间上网,就在网上查了一下,很多论坛、搜问、百度知道的回答都是什么硬件配置不够啊,软件不兼容啊,等等,这样的回答让我很不能信服。虽然不能说自己是个电脑高手,但也绝对不是个菜鸟啊,很明显我的电脑出现这个问题绝对不是以上这些原因造成的。继续搜索,不懈努力下终于找到了一个还算是有点技术可行性的解决方法,一试,果然好了,现将方法分享过来,一为了记录,二为了帮助一些电脑小白们不要再去盲目搜索了,搜索那些有的没的的原因和解决方法。

     

    其实WIN7的这个未响应的问题的原因跟WIN7优化大师的优化有着直接的关系,一直感觉WIN7优化大师并不是一如Windows优化大师那么好使,上网看了看这两者貌似也并不是一个团队制作出来的软件,两者貌似根本没什么关系,只是名字差不多罢了。好了现在进入正文,解决方法如下:

    1.打开注册表(WIN键+R运行regedit)

    2.找到下列值后删除

      HKEY_USERS\.DEFAULT\Control Panel\Desktop\HungAppTimeOut

      HKEY_USERS\.DEFAULT\Control Panel\Desktop\WaitToKillAppTimeOut

      HKEY_CURRENT_USER\Control Panel\Desktop\HungAppTimeOut

      HKEY_CURRENT_USER\Control Panel\Desktop\WaitToKillAppTimeOut

      HKEY_CURRENT_USER\Control Panel\Desktop\WaitToKillServiceTimeOut

    注意一定要小心检查下路径和键值名称,一样后再删除,不然删除错了很容易引起更大的系统问题。以上5项并一定都有,像我就只有2项,有几项删几项就行了。

     

    删完之后关闭注册表重启计算机即可看到效果,问题应该就解决了,由于时间有限我只试验了下切换游戏,已经可以很流畅的切来切去,不再出现未响应了。以上方法在我的计算机上试验成功,至少说明它是有用的,总比没有目标的瞎弄好,大家看好我用黑体字标出来的我的系统环境,如果跟我的系统环境一样而且用WIN7优化过后也出现这个问题的就可以用以上的解决方法,绝对可以解决。最后希望大家都可以完美解决这个问题,用上最舒心的系统。

    展开全文
  • win10电脑关机时总是提示如下: 解决方法如下: 1、按下WIN+R,然后输入gpedit.msc 回车 ...3、将把"关闭会阻止或取消关机的应用程序的自动终止功能“设置为:已禁止 一次点击如图所示内容 ...
  • MySQL安装 最后一步 execute 未响应解决方法 电脑环境: windows10教育版 64位 (OS内部版本:16299.125) MySQL版本:mysql-5.0.96-winx64 问题: 为了写上一篇博客“Windows10下安装MySQL5.0详细教程”记录...
  • Unity未响应重启后进不去的解决方案

    千次阅读 2019-04-03 10:51:03
    偶尔UnityEditor出现未响应的情况,只能强制结束,重启后发现一直进不去,但后台进程是有Unity.exe的。 解决方案: 删除以下文件夹,重启 C:\Users\用户名\AppData\Local\Unity C:\Users\用户名\AppData\LocalLow\...
  • 接着程序自动运行MySQL Server Instance Configuration Wizard(MySQL实例配置向导)程序,一如既往地采用自定义的详细配置,结果在最后一步执行的时候,却一直卡在[Start Service]处,程序一直处于未响应状态,等了...
  • MySQL安装到最后一步未响应的五种解决方法

    千次阅读 多人点赞 2020-02-04 14:48:55
    造成这种现象的原因...1、打开任务管理器结束未响应的MySQL安装程序; 2、依次打开 控制面板 ——> 所有控制面板项 ——> 程序和功能,卸载MySQL Server 5.0,若控制面板没有MySQL Server 5.0就不用做这一...
  • 如果你使用Win8/Win10系统时经常...结束第一个未响应程序,其它未响应的就会有响应了。重装系统也无法解决 解决办法:出现问题的原因可能是输入法引起的,排除其它软件自身BUG情况下,输入法模块最有可能注入到任...
  • 1、有程序阻止windows重新启动/关机 办法:修改本地组策略,避免在重启时出现“此程序正在阻止windows重新启动”界面。 使用键盘组合键win+R调出运行栏,输入gpedit.msc,在计算机配置中依次选择管理模板>系统>关机...
  • 会导致程序未响应”, 在FormDestroy的时候IdTCPServer1->Active=false; 会导致程序无法正常结束(会一直留在任务管理器进程列表中), 这个是为什么,怎么样才能正常地执行IdTCPServer1->Active=false; ...
  • eclipse经常未响应优化

    万次阅读 2015-06-03 10:30:39
    两个都是256M,看来小了点,我给它调成512M,再启动Eclipse,打开工程时一点都不卡,未响应的情况也没有了。   -------------------------------------------------- Eclipse无响应假死的解决...
  • 这段时间一直在学习python,然后用thinter模块写了一个图像界面,界面中有一些按钮,按钮所绑定的方法处理起来需要点时间,所以开始的时候点击了按钮,发现界面卡着,未响应,无法进行操作。这个问题对于新手的我来说...
  • mysql安装最后一步出现未响应的解决方案 1.alt+ctrl+delete打开任务管理器,找到MySQLInstanceConfig.exe 结束任务 2.然后在本地硬盘找到你自己的MySQL的安装文件夹 3.打开bin目录 4.直接运行MySQLInstanceConfig....
  • mac os 强制退出无响应应用程序

    万次阅读 2012-08-20 21:08:47
    mac os 中,难免回碰到应用程序响应的情况,这时发现 ctrl + alt + delete不再好使了。网上找了下资料,发现强制退出应用程序有以下六种方法: 1、使用键盘快捷键强制退出处于活跃状态的Mac程序 快捷键:...
  • 如何判断一个程序没有响应

    千次阅读 2013-12-13 09:52:17
    如何判断一个程序没有响应 一.概述 一些重要的程序,必须让它一直跑着;而且还要时时关心它的状态——不能让它出现死锁现象。当然,如果一个主程序会出现死锁,肯定是设计或者编程上的失误。我们首要做的事是,...
  • MFC程序中进度条无响应的解决方案

    千次阅读 2015-11-04 11:09:03
    前些天写的MFC程序,每次程序运行后处理大任务时进度条都会出现无响应的情况,只由处理结束才会再次更新,并且是直接更新到进度条满的状态,十分不爽。今天再次运行MFC程序,实在不能忍受这种情况,在网上查找资料,...
  • 下图未响应>  下图任务管理器无响应> 下图已停止工作>   结束任务进程之后重新开启,异常现象规律性的在1分钟左右反反复复,这可让我头都大! 因为是程序自动停止响应,然后前面我有提到重新...
  • 经常发现一些坦克战友说,自己电脑的系统是WIN7系统,在玩坦克的时候会出现未响应,跳频特别高。给客服打电话,也未能解决问题。 小弟,最近刚玩的坦克,也遇到了。类似的问题,更换电源,显卡,网卡,重新做系统,...
  • 1、打开任务管理器结束未响应的MySQL安装程序;  2、依次打开 控制面板 ——&gt; 所有控制面板项 ——&gt; 程序和功能,卸载MySQL Server 5.0,若控制面板没有MySQL Server 5.0就不用做这一步了;  3、...
  • 程序响应且无法关闭的解决方法

    万次阅读 2014-08-07 10:32:14
    在使用Windows操作系统的过程中,您可能会遇到这样的情况:某个程序停止响应挂住了,无法操作也关闭不了。   解决方案: 第一步: 在桌面上新建一个快捷方式。在桌面空白处右键鼠标,选择“新建“>“快捷方式”。 ...
  • 在操作完成之前超时时间已过或服务器未响应。 针对这个问题可以从以下几个房方面考虑:(若您有高见,请留言,谢谢) 一:执行命令超时;  SqlCommand命令执行超时,这时需要修改CommandTimeout的默认值(默认值...
  • 客户端程序响应,卡死,卡顿了?抓个dump看下卡在哪里了。原文链接工具下载链接为什么会无响应windows的客户端程序一般都有一个主线程来处理消息,一般都在winmain函数中实现。主线程根据不同的消息做不同的任务,...
  • 通常要开发网络应用程序并不是一件轻松的事情,不过,实际上只要掌握几个关键的原则也就可以了――创建和连接一个套接字,尝试进行连接,然后收发数据。真正难的是要写出一个可以接纳少则一个,多则数千个连接的网络...
  • Android-程序(***)无响应,要将它关闭吗 一个Android数据采集App,主要采集的是硬件串口、AD等数据,采集数据程序写在后台的service里边,前台的activity负责显示实时的数据,在实际环境中部署后,设备运行一段...
  • 使用起来没有问题,但是最近打算改用台式机,硬件配置高,画板子快速,但是,安装了之后,打开Orcad Capture CIS 后就卡住不动了,只能在任务管理栏里结束,开始以为是破解成功,又重装了一遍,还是不行。...
  • cpu的中断响应时间

    万次阅读 2016-05-05 10:47:58
    从发出中断请求到进入中断处理所用的时间 计算机中CPU的中断响应时间指的是()的时间。 A.从发出中斯请求到中断处理结束 B.从中断处理开始到中断处理结束 C....D. 从发出中断请求到开始进入中断处理...程序执行结束
  • Mac上使用word写论文,突然卡死无响应,而且内容保存 使用command+Q强制退出后恢复保存内容方法如下: 找到mac桌面左上角的前往->前往文件夹。 输入/private/var/folders/如图所示 在folders中...
  • 在操作完成之前超时时间已过或服务器未响应”,简直把人气死了,最后发现竟然是少了一句Close(); 初学Asp.Net的人经常会忘掉关闭数据库连接,这一点非常重要。把我的发现写出来,希望出现同样问题的人可以参考一下...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 162,312
精华内容 64,924
关键字:

如何结束未响应程序