我有一个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()方法,由我的接收线程调用,我保存收到的消息。
我想睡在我的主程序中,我们在收到答案时醒来。
我无法使用信号/插槽,因为在插槽中,我不知道我发送的最后一个请求是什么,因此我无法继续发出请求。
我该怎么做? 感谢
答案 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 );
}