【发布时间】:2016-05-23 05:43:42
【问题描述】:
我有一个 QPushButton,它对 pressed() 和 released() 信号执行冗长的操作。在执行buttonReleased() 槽的操作之前,如何确保我完成了buttonPressed() 槽的所有操作?
我尝试过使用 QMutex,但是当尝试在按钮释放时锁定时,程序似乎陷入了无限循环,此时互斥锁仍被 buttonPressed() 函数锁定:
我的主窗口.h:
#include <QMutex>
// ...
QMutex mutex;
我的主窗口.cpp:
#include <QEventLoop>
#include <QTimer>
// ...
// In the main window constructor:
connect(myButton, SIGNAL(pressed()), this, SLOT(buttonPressed()));
connect(myButton, SIGNAL(released()), this, SLOT(buttonReleased()));
// ...
void MyMainWindow::buttonPressed()
{
mutex.lock();
// Here, I do the lengthy stuff, which is simulated by a loop
// that waits some time.
QEventLoop loop;
QTimer::singleShot(1000, &loop, SLOT(quit()));
loop.exec();
mutex.unlock();
}
void MyMainWindow::buttonReleased()
{
mutex.lock();
// ... (some stuff)
mutex.unlock();
}
【问题讨论】:
-
您能否更详细地解释一下,您要达到什么目的?我觉得这个逻辑很奇怪。为什么在按下按钮和松开按钮时都会进行冗长的操作?
-
@thuga 该按钮控制步进电机:按下按钮时打开,释放点击时关闭。当我按下按钮时,我会向控制电机的电子设备发送几个命令。这需要时间,因为我必须等待电子设备的响应。此外,电机需要缓慢加速以避免机械损坏,这涉及到启动它的命令序列中的实际 QTimer。当我释放点击时,我想发送其他命令来停止电机,但这应该在
buttonPressed()结束后完成。 -
你所有的槽都在同一个线程中执行,所以使用互斥锁是没用的。
-
添加某种命令队列。当您按下按钮时,将您使用的所有命令添加到队列中。释放按钮时,将停止命令添加到队列中。不要等待任何事情,只需回复您从电子设备收到的消息。每次命令完成时,您都会从队列中获取下一个命令并将其发送到您的电机。
标签: c++ qt mutex signals-slots qmutex