不应从线程外部完成终止/终止线程,因为这可能会导致数据损坏。甚至 Qt 文档也提到了这一点:
警告:此功能很危险,不鼓励使用。这
线程可以在其代码路径中的任何点终止。线程可以是
修改数据时终止。线程没有机会
自行清理,解锁任何持有的互斥体等。简而言之,使用
仅在绝对必要时才使用此功能。
那么该怎么办?我想您可以使用线程之间共享的变量来像这样优雅地完成它们。在类中放置一些标志,如下所示:
public:
atomic<bool> finish = false;
然后,稍微改变一下流程:
void RxFTDI::process() {
qDebug() << "RxFTDI hello!" << QThread::currentThreadId();
while(!finish.load(std::memory_order_relaxed))
{
FT_GetStatus(ftHandle,&RxBytes,&TxBytes,&EventDWord);
// FT_GetQueueStatus(ftHandle, &RxBytes);
if ((ftStatus == FT_OK) && (RxBytes > 0))
{
// qDebug() << "rx " << RxBytes;
FT_Read(ftHandle, &RxBuffer, RxBytes, &BytesReceived);
if (ftStatus == FT_OK) {
// FT_Read OK
}
else {
// FT_Read Failed
}
}
}
}
最后运行线程的函数:
bool Ftdi::quitRxTxThreads ()
{
emit Tx->finished();
emit Rx->finished();
delete Tx;
delete Rx;
RxThread->finished.store(true, std::memory_order_relaxed);
TxThread->finished.store(true, std::memory_order_relaxed);
//now wait for them to finish
RxThread->wait();
TxThread->wait();
delete TxThread;
delete RxThread;
return true;
}
当然,这不是最简洁的设计等等,但希望您能明白;)