Multithreading Qt阻塞螺纹,直到满足条件

Multithreading Qt阻塞螺纹,直到满足条件,multithreading,qt,Multithreading,Qt,我希望将命令/init与QueuedConnection一起使用,以便从gui线程异步并按顺序执行它们。(我说得对吗?) 我怎样才能有效地实现阻塞?好的,因此我根据给出的注释的清晰程度进行了编辑。最好看的地方是公园。这可以更好地分解用于并发的系统 对于您的示例,我已经向您的驱动程序类添加了一个QMutex对象。如果您想将基于线程的控件移动到MyDevice类中(如果您有访问权限的话),那么可能需要考虑一下 class Driver : Public QObject { Q_OBJECT

我希望将命令/init与QueuedConnection一起使用,以便从gui线程异步并按顺序执行它们。(我说得对吗?)


我怎样才能有效地实现阻塞?

好的,因此我根据给出的注释的清晰程度进行了编辑。最好看的地方是公园。这可以更好地分解用于并发的系统

对于您的示例,我已经向您的驱动程序类添加了一个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;