Multithreading Qt阻塞螺纹,直到满足条件
我希望将命令/init与QueuedConnection一起使用,以便从gui线程异步并按顺序执行它们。(我说得对吗?)Multithreading Qt阻塞螺纹,直到满足条件,multithreading,qt,Multithreading,Qt,我希望将命令/init与QueuedConnection一起使用,以便从gui线程异步并按顺序执行它们。(我说得对吗?) 我怎样才能有效地实现阻塞?好的,因此我根据给出的注释的清晰程度进行了编辑。最好看的地方是公园。这可以更好地分解用于并发的系统 对于您的示例,我已经向您的驱动程序类添加了一个QMutex对象。如果您想将基于线程的控件移动到MyDevice类中(如果您有访问权限的话),那么可能需要考虑一下 class Driver : Public QObject { Q_OBJECT
我怎样才能有效地实现阻塞?好的,因此我根据给出的注释的清晰程度进行了编辑。最好看的地方是公园。这可以更好地分解用于并发的系统 对于您的示例,我已经向您的驱动程序类添加了一个QMutex对象。如果您想将基于线程的控件移动到MyDevice类中(如果您有访问权限的话),那么可能需要考虑一下
class Driver : Public QObject
{
Q_OBJECT
private:
// method command: sends a command
// signal ok: command executed, sends back a message
MyDevice *device;
public:
Deriver()
{
device = new MyDevice(0);
connect (mydevice,&MyDevice::ok,this,&Driver::onInitOk);
}
public slots:
void init()
{
device->command("init");
//at this point, I want to block this method until the device signals ok with a given msg
}
command()
{
device->command("setmode x");
device->command("cmd");
//at this point, I want to block this method until the device signals ok with a given msg
}
void onInitOk(QString msg)
{
//somehow unblock the actually running command, if the msg matches
}
}
请记住,我假设您希望从插槽机制访问功能。因此,我们使用moveToThead()函数。当通过GUI线程中的插槽访问对象时,它现在将在另一个线程上运行该函数
同样地,互斥体只会对共享该互斥体实例的所有对象进行阻塞。因此,根据您的实现,您可能需要考虑什么是公开互斥锁的正确方法。与其阻止,不如对收到的消息做出反应?我不知道QWaitCondition在这里如何使用。我只希望取消阻止作为一种反应。什么是“Qt提供的实际库”?我想要实现的是无阻塞,并避免对同一设备的并发访问。性能不是问题。@AndrásKovács好的,你的需求现在更清楚了。您最好的选择是使用QMutex对象。我知道QMutex的功能,但它并不简单,在这种情况下如何使用它。@AndrásKovács我根据您的实现添加了一个示例,这有帮助吗?此实现的主要问题是,不能保证第一个锁定的命令被解锁。这不是很清楚,但我必须支持多个命令。
Driver()
{
moveToThread(new QThread());
device = new MyDevice(0);
}
void init()
{
mutex.lock();
const QString& result = device->command("init");
onInitOk(result);
}
void command()
{
mutex.lock();
device->command("setmode x");
const QString& result = device->command("cmd");
onInitOk(result);
}
void onInitOk(QString msg)
{
...[STUFF]
// Even when things go wrong you MUST unlock the mutex at some point.
// You can't keep the thread blocked forever in cases of poor results.
// As such it might be better practice to unlock in
// the same function that locks!
mutex.unlock();
}
QMutex mutex;