我是一名新手,对C++和Qt一无所知,在实现一个良好且不复杂的多线程通信环境方面遇到了一些麻烦。
基本上我有3个线程,一个用于GUI
,另一个用于处理由连接到PC的USB设备发送的更新,还有一个将处理由device
获取的信息并控制
device
和GUI
以更改它们的状态。 所以基本上有3个线程:GUI
,device
和control
。
我的第一种方法是让device
使用通过USB发送的信息填充其私有成员,并具有一些get()
方法来转换此数据并返回它(使用互斥锁确保数据仍然有效)。 问题在于当control
调用device
中的get()
方法时,它不会返回任何新信息(我期望这些方法甚至从不返回,因为线程被锁定在另一个方法中,但它们确实返回,而且没有触发get()
方法内部的任何断点)。
Qt通常执行跨线程通信的方式是使用Signal 和 Slots,但Signal和Slots的问题是当一个线程正在处理并且具有Slot时,如果发送了某些Signal,则此Slot将永远不会执行。 即使我能够设法使用Signal和Slots触发新数据更新,我担心会有大量的Signal被发送,因为该设备更新非常快,而且我有很多数据类型,并且使用QAtomicInt对许多数据类型将没有用,所以我的一般问题是如何以最佳方式使线程共享数据并仍然保持运行无限进程循环?
我的目标的一个好例子是:
控制线程:
while(true){
angle = device.getAngle(); //device is a member of control object and is running in a separate thread
doCalculations(angle);
}
设备线程:
void process(){
while(true)
usbRead(data, size_of_data);
}
short getAngle(){
return (data[0] << 8 | data[1]);
}
在这个例子中,我没有放置互斥锁等内容,仅提供基本功能。
如所请求的那样,以下是我如何启动我的线程:
test::test(QWidget *parent) : QMainWindow(parent) , cvControl(device, 0)
{
//ui setup
connect(&device, SIGNAL(deviceConnected(bool)), this, SLOT(updateStatusConnection(bool)));
device.moveToThread(&deviceThread);
cvControl.moveToThread(&controlThread);
connect(&deviceThread, SIGNAL(started(void)), &device, SLOT(process(void)));
connect(&device, SIGNAL(deviceFinished(void)), &deviceThread, SLOT(quit(void)));
connect(&cvControl, SIGNAL(controlFinished(void)), &controlThread, SLOT(quit(void)));
connect(&deviceThread, SIGNAL(finished(void)), &device, SLOT(deleteLater(void)));
connect(&controlThread, SIGNAL(finished(void)), &cvControl, SLOT(deleteLater(void)));
connect(this, SIGNAL(startControlProcess(void)), &cvControl, SLOT(process(void)));
deviceThread.start();
controlThread.start();
}
void test::on_btnRun_clicked()
{
if(ui.btnRun->text() == "Run")
{
ui.btnRun->setText(QString("Stop"));
disbleControls();
emit startControlProcess();
}
else
{
ui.btnRun->setText(QString("Run"));
enableControls();
cvControl.abort.store(1);
}
}
QCoreApplication::processEvents()
怎么样? - Michel Feinsteinexec()
并等待它返回? - Michel Feinstein