使用QApplication::processEvent()实现非阻塞界面的延时响应

防止界面阻塞,很明确的一种方法就是再开一个线程。但有时也可以使用processEvent()。

QProcessEvent()的作用是使程序进入消息循环,处理其他事件。可以用在需要执行很长时间的界面对象成员的循环中,在里面加一句processEvent()使界面不会出现卡死状态。

例子里实现按钮后页面等待2秒钟后弹出文字

void HelloQt::delaymsecNoBlock()
{
	int msec = 2000;
	QTime dieTime = QTime::currentTime().addMSecs(msec);
	//QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
	while (QTime::currentTime() < dieTime)
		QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
	//QApplication::restoreOverrideCursor();
	ui.label_3->setText("Time out");
	// "In BlockTime" << std::endl;
}

运行过程中界面不会卡死

QTime startTime = QTime::currentTime();
	qDebug() << "startTime:" << startTime << endl;
	qDebug() << "smesc:" << startTime.msecsSinceStartOfDay() << endl;
	int m = 0;
	for (int i = 1; i < 100000; i++)
	{
		//m += i;
		ui.progressBar->setValue(i);
		//QCoreApplication::processEvents();
	}
	QTime dieTime = QTime::currentTime();
	qDebug() << "dieTime:" << dieTime << endl;
	qDebug() << "dmesc:" << dieTime.msecsSinceStartOfDay() << endl;
	qDebug() << "time diff is " << dieTime.msecsSinceStartOfDay() - startTime.msecsSinceStartOfDay() << endl;

另外对比了一下调用processEvents和不调用的时间,调用时执行简单更新进度条100000次耗时5800ms,不调用时耗时4300ms,慢了1500ms左右。

而且发现,当只做累加计算时,即:

int m = 0;
	for (int i = 1; i < 100000; i++)
	{
		m += i;
	}

耗时0ms。

--------------------------------------------------------------

第二天更新:

今天发现使用processEvent()后,如果一直触发其他的事件(比如在标题栏中按住鼠标左键),processEvent()就不会返回了。其所在的循环代码就无法继续执行了。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值