利用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。

  • 8
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
QNetworkAccessManager是Qt网络模块中的一个类,它提供了一种方便的方式来发送网络请求并接收响应。下面是对你提到的特性的详细解释: 1. 使用QEventLoop实现同步请求:QNetworkAccessManager默认是异步的,这意味着当你发送一个请求后,它会在后台运行,不会阻塞你的主线程。但是,有时你需要等到请求完成后再执行下一步操作,这时就可以使用QEventLoop实现同步请求。具体做法是,在发送请求后创建一个QEventLoop对象,然后调用其exec()方法进行阻塞等待请求完成,请求完成后再退出循环。 2. 异步请求可以传一个QVariant参数:QNetworkAccessManager的异步请求使用QNetworkReply对象来处理响应。你可以使用QNetworkRequest的setUserData()方法将一个QVariant对象附加到请求中,然后在QNetworkReply的finished()信号中获取这个对象。 3. 可以设置超时时间:QNetworkAccessManager提供了一个setTimeOut()方法,可以设置请求的超时时间,单位是毫秒。如果请求在超时时间内没有完成,则会自动取消请求并发出timeout()信号。 4. 可以使用get和post方法,并设置参数ContentTypeHeader:QNetworkAccessManager提供了get()和post()方法用于发送GET和POST请求,你可以使用QNetworkRequest的setHeader()方法设置请求头,包括Content-Type等参数。 以上就是QNetworkAccessManager的一些常用特性,希望能对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值