在执行buttonReleased()之前等待buttonPressed()槽完成

时间:2016-05-23 05:43:42

标签: c++ qt mutex signals-slots qmutex

我有一个QPushButton,可以对settingDependentObjectpressed()信号执行冗长的操作。在执行released()插槽之前,如何确保完成buttonPressed()插槽的所有操作?

我尝试过使用QMutex,但当试图锁定按钮释放时,当互斥锁仍被buttonReleased()函数锁定时,程序似乎陷入了无限循环:

mymainwindow.h:

buttonPressed()

mymainwindow.cpp:

#include <QMutex>

// ...

QMutex mutex;

2 个答案:

答案 0 :(得分:1)

通常使用互斥是一种线程同步机制,这里你不需要线程同步,因为你在同一个线程中。否则我会建议使用QWaitCondition等待标志/互斥量改变(即表示你的情况现在可以继续)。

在你的情况下,你可以在你的“buttonPressed”动作完成后发出一个信号(即当你的计时器结束?)。如果buttonPressed()函数的结束是你想要执行你的buttonRelease()函数的时候那么你可以简单地使用Qt :: QueuedConnection来确保事件的正确顺序(我通常不喜欢直接连接,因为它们就像函数调用(甚至中断 - 就像我认为发生在你身上的那样)。所以以下更改可能会以一种简单的方式解决这个问题:

// In the main window constructor:
connect(myButton, SIGNAL(pressed()), this, SLOT(buttonPressed()), Qt::QueuedConnection);
connect(myButton, SIGNAL(released()), this, SLOT(buttonReleased()), Qt::QueuedConnection);

我不确定执行你的事件循环以“模拟”你的“很长时间”会起作用....但如果你做了更像下面的事情来模拟你的长执行时间:

QElapsedTimer elapsedTime;
elapsedTime.start();
while (elapsedTime.elapsed() < 1000) // millisecs
{
    // wait....
}

如果这不起作用,那么只需在buttonPressed()结束时发出一个信号,并在buttonReleased()中设置一个标志,这样:

void MyMainWindow::buttonPressed()
{
    // actions here
    emit buttonPressedDone();
}

void MyMainWindow::buttonReleased()
{
    btnReleased = true;
}

void MyMainWindow::buttonPressedCompleted()
{
    if (btnReleased )
    {
        // Do button released actions here
        btnReleased  = false;
    }
    // I am assuming that if the flag is not set then you don't want to do anything... but up to you...
}

并连接buttonPressedDone - &gt; buttonPressedCompleted

还有更多选项...这些只是您的一些选择......

答案 1 :(得分:0)

是否需要连接以释放按钮的SLOT?您只需连接到destroyed()的{​​{1}}信号,然后拨打QEventLoop SLOT。

buttonReleased()

评论编辑:

QEventLoop loop;
QTimer::singleShot(1000, &loop, SLOT(quit()));
connect(&loop, &QEventLoop::destroyed, this, &MyMainWindow::buttonReleased);
loop.exec();