Qt如何在接收数据之前进行阻塞

Qt如何在接收数据之前进行阻塞,qt,wait,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()方法,由我的接收线程调用,在这里保存收到的

我有一个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()方法,由我的接收线程调用,在这里保存收到的消息

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

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

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

// wait for answer and analyze it??

SendReadLatchCommand(fam,prod,addr,0x00000002, 4);  // 2nd request
我该怎么做?
谢谢

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

查看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

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

通常,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 );
}

waitForReadData(),但真正尝试将其提取到插槽中,一种方法是使用QStateMachines(如果有点过分),我不知道QEventLoop,但我认为它不起作用。我的请求和回答是同步的。我想下载一个远程服务器上的文件。所以我必须读取地址,发送数据块。在每个请求之后,我等待答案,我分析它,如果它被破坏,我再次发送它。所以我想要一种让我的主线等待答案的方法。因为,如果我以不同的方式收到答复,很难知道最后发送的请求。。但是我会尽力保存最后一个状态作为状态机,并将数据分析到一个时隙中。虽然QSemaphore是值得注意的,但是我认为QEventLoop是一个更好的结构。QSemaphore可以扩展以创建生产者/消费者体系结构,其中等待的线程成为消费者。我已经实现了这样一个体系结构,它生成由使用者执行的回调,但代码非常广泛。回顾过去,我认为在正确的接口后面进行正常的条件等待就足够了。EventLoop可能有点过分,但我还不明白为什么它不能成为一个解决方案。我喜欢你的解决方案,但我尝试了QWaitCondition,它阻止了我的接收线程,因为它接收了很多其他消息,似乎无法阻止线程。因此,我将实现一种排序器。我保存最后发送的邮件,并在接待处分析答复。抱歉,现在才答复。我不确定发送到can设备的是阻塞还是非阻塞。如果阻塞,则意味着互斥锁被锁定的时间过长,从而阻止接收线程接收。我已经稍微修改了我的解决方案。