Qt如何进行阻塞等待直到接收数据

时间:2013-11-18 09:43:08

标签: qt wait

我有一个qt程序。我有CAN请求,我想按顺序发送。 我想在发送其他请求之前等待答案。

SendReadLatchCommand(fam,prod,addr,0x00000000, 4);  // 1st request

// wait for answer and analyze it??

SendReadLatchCommand(fam,prod,addr,0x00000002, 4);  // 2nd request

我有一个receiveData()方法,由我的接收线程调用,我保存收到的消息。

我想睡在我的主程序中,我们在收到答案时醒来。

我无法使用信号/插槽,因为在插槽中,我不知道我发送的最后一个请求是什么,因此我无法继续发出请求。

我该怎么做? 感谢

2 个答案:

答案 0 :(得分:2)

如果我理解正确,您希望同步处理请求

查看qtdoc中的QEventLoop,你可以这样做:

QEventLoop wait_loop;
// 1st request
connect(request_1, SIGNAL(sig_answer_arrived()), &wait_loop, SLOT(quit()));
request_1->send_request();
wait_loop.exec();
// here we already got the answer
analyze_answer();

// the 2nd request does the same

答案 1 :(得分:0)

我不确定阻塞主线程是否是一个好主意,但是可以通过使用二进制信号量来完成,这与maxCount为1的计数信号量相同。因此可以使用计算信号量QSemaphore

通常,QSemaphore是根据QWaitCondition实现的(请参阅Qt帮助)。可以阻止等待状态直到CAN线程发出等待状态的信号。人们可以隐藏某些界面后面的等待阻塞,例如:

//--- Very simple implementation - concept only

QWaitCondition cond_;
QMutex mutex_;

void rxThreadHandler( /*args*/ )
{
  while( !quitCalled() )
  {
    waitOnReceivedData();//Blocks, I assume...
    handleReceivedData();
    answerRxd(); 
  }
}

void answerRxd()
{
  QMutexLocker lock( mutex_ );
  cond_.wakeAll();
}

void sendNext( const Buffer& buffer )
{
  QMutexLocker guard( mutex_ );
  //Waits/Blocks until condition signalled, then locks mutex 
  // to prevent further signalling (might block rx thread)
  cond_.wait( lock.mutex() );
  //Unlocking mutex explicitly to allow receipt of data
  guard.unlock();
  //Now send as result of previous receive. This does not
  // prevent receiving thread...     
  sendNextImpl( const Buffer& buffer );
}