如何防止QT程序未响应

       在日常的开发中,偶尔会执行一些可能很费时的代码,比如进行大规模的数据运算,生成或者拷贝文件,网络请求等,这些操作如果放在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 
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值