我有这样的代码:为什么互斥已经解锁
mainwindow.h:
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow {
private:
QMutex mutex;
}
mainwindow.cpp:
void MainWindow::on_calculateBtn_clicked() {
QMutexLocker locker(&mutex);
qDebug() << "mutex has been locked" << endl;
ui->calculateBtn->setEnabled(false);
startProcess(); // huge calcutations
ui->calculateBtn->setEnabled(true); // performed before startProcess() has finished (why?)
qDebug() << "mutex will be unlocked" << endl;
}
如果我点击calculateBtn同时再次startProcess()有没有完成后,我的程序崩溃了:
pure virtual method called
The program has unexpectedly finished.
我想:
void MainWindow::on_calculateBtn_clicked() {
if (!processing) {
processing = true;
ui->calculateBtn->setEnabled(false);
startProcess();
ui->calculateBtn->setEnabled(true); // performed before startProcess() has finished (why?)
processing = false;
}
}
没有共享数据,我只想一个startProcess()不会其他startProcess之前启动()完成。 为什么发生?我认为互斥锁必须在on_calculateBtn_clicked()中锁定函数startProcess(),并且不会发生任何事情。看来我不知道任何重要的事情。提前感谢您的任何建议。
我99.999%肯定你正在做的事情不会做你想做的。图形用户界面处理程序几乎总是作为一个状态机由ONE THREAD运行。在GUI事件处理程序中,您不得进行任何可能会阻塞任何延长时间间隔的电话(这意味着“人类注意力”)。如果'startProcess();'发出一个线程或threadPooled任务,该任务应该向GUI线程发出完成信号,然后可以重新启用该按钮。你不能等待一个事件处理程序,然后启用按钮。 GUI状态机不像控制台程序,你不能像这样编写它们:) –
看起来像是错误地使用了'mutex'变量。你需要提供更多关于创建和使用这个变量和'startProcess()'定义的信息。 –
@VladimirBershov我修改了我的问题,我尝试添加了一些代码 – Wanksta