利用QEventLoop 和 QTimer 实现定时阻塞等待某一信号,若未收到信号则报超时,且不影响程序其它正常响应

Qt在Windows下使用waitForconnected()或者其它waitFor…系列函数,会随机失效(Qt官网的解释),我自己也是碰到过这个问题。如果不用waitFor…系列函数,怎样实现阻塞等待的功能呢。用QEventloop和QTimer可以实现这个功能。

bool QtWidgetsApplication1::WaitForSignalFinished3(const char * signal, const unsigned int millisecond)
{
	bool result = true;

	QEventLoop loop;
	connect(this, signal, &loop, SLOT(quit()));

	QTimer timer;
	timer.setSingleShot(true);
	connect(&timer, &QTimer::timeout, [&loop, &result] { result = false;  loop.quit(); });
	timer.start(millisecond);

	loop.exec();
	timer.stop();
	return result;
}

核心点是使用QEventLoop阻塞当前程序,如果有信号发出,则loop->exec()正常退出,返回true;如果信号在millisecond时间内没有发出,定时器会触发。使用Lambda将result置为false。此时loop->exec()退出时会返回false。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值