C ++如何等到满足条件?

时间:2016-05-08 23:24:38

标签: c++

在C ++中,我怎么能等到满足条件,例如 - 伪代码:

bool con = false;
waituntil(con);
//do whatever

3 个答案:

答案 0 :(得分:2)

如果您使用的是Qt API,可以使用QEventLoop,如下所示:

QEventLoop loop;
QWidget::connect(lineEdit, SIGNAL(editingFinished()), &loop, SLOT(quit()));
loop.exec();

您的应用程序在继续作出响应的同时,但在QLineEdit对象完成编辑之前不会退出该循环。

您可以自由使用任何与您相关的信号,甚至可以在用户点击QLineEdit时立即创建自定义信号

答案 1 :(得分:-1)

在回应The Badger的评论时,我为太模糊而道歉。  以下是对以下代码如何运作的完整解释。

您可以使用Q_PROPERTY宏以及类似@TheRealNox描述的方法。

原始帖子询问当con等于true时如何执行特定操作    它说:

    waituntil(con);
   // do whatever

嗯,下面我概述了一种可以使用Qt执行操作的方法,只要布尔类型对象名为" con"变化。此方法使用Q_PROPERTY通过指定NOTIFY关键字来设置要发出的信号。

  Q_PROPERTY(bool con  MEMBER con NOTIFY con_changed)

这里要注意的重要部分是NOTIFY con_changed部分。 通过添加单词NOTIFY后跟一个信号(在这种情况下为con_changed),基本上每当MEMBER发生变化时(在这种情况下" con"),它就会发出信号" con_changed"以便你的程序的其他部分可以"听到"信号并作出相应的反应。

让我们看一下这个示例头文件,这个例子在下面进行了解释。

在myclass.h中

class MyClass : public QObject {

    // emits the   'con_changed' signal whenever   con changes
    Q_PROPERTY(bool con MEMBER con NOTIFY con_changed)   

    Q_OBJECT

    public:
        MyClass(QObject *parent = 0);
        bool con;
    signals:
        void con_changed(bool new_con_value);
    public slots:
       void check_con_value(bool new_con_value);
}

现在,如果您查看第一个框中的代码,您会注意到我已使用"信号指定了SIGNAL:"与Q_PROPERTY的NOTIFY参数中提到的签名(名称)相同的宏。 (在这种情况下,它是con_changed)

信号本质上是对象使用Qt与另一个对象通信的一种方式,并且是线程安全的。

同样在上面的代码中,您应该注意到还有一个"公共插槽:"我定义方法的部分" check_con_value(bool new_con_value)。

这将是一个连接到信号" con_changed"的插槽,基本上是这样,只要" con_changed"信号被发送,它将自动导致插槽:" check_con_value"执行。但是,截至目前,插槽check_con_value和con_changed尚未连接在一起,我们将在下一个文件中进行连接。

myclass.cpp中的

     #include "myclass.h"
     MyClass::MyClass(QObject* parent) : QObject(parent) {
         con = false;
      // connect the con_changed signal to execute check_con_value
         connect(this, SIGNAL(con_changed(bool), 
                 this, SLOT(check_con_value(bool));
     }



    void MyClass::check_con_value(bool new_con_value)  {

        if (new_con_value == true) {

            /***********        
             *
             *   here's where you perform whatever actions you want
             *
             **/

         }

    }

上面的代码中有两件事情需要注意。

首先,我已经连接了信号" con_changed"到插槽" check_con_value"通过使用connect方法。基本上通过键入connect(发送者,SIGNAL,接收者,SLOT)来连接工作。我觉得解释连接超出了这个响应的范围,但无论如何,

上面发生的第二件事是我们已经输入了" check_con_value" slot,只要con_changed作为信号发送就会执行。在那个插槽里面你会注意到有一个条件if语句:

if (new_con_value == true) {
   // execute your code here.

  }

所以,基本上这意味着,如果你使用Q_PROPERTY定义设置程序,那么只要你想等到con为真,然后在发生这种情况时执行一些代码,你可以将con设置为false,如下所示:

 con = false;

然后只要它变为true,代码就会执行。

这可能过于复杂,但原来的帖子只是一个句子,因此根据其中包含的信息,这就像我真正能够回答他们的问题一样接近。

还有其他解决方案,根据此特定功能的使用情况,这可能是也可能不是设置等待条件的理想方式。

事实上,还有其他更简单的解决方案,但这种方式是一种更有条理,更干净的方式来执行所需的功能。

我想这一切都取决于用例是什么,OP没有包含在内。

答案 2 :(得分:-2)

要等到条件满足,您需要让程序循环包含条件的代码部分。

例如:

bool con = false;

while(programIsRunning) {

    //your program

    while(con) {
         //wait until con
    }

}