mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QThread>
class ThreadA : public QThread
{
public:
ThreadA () {}
void run();
};
class ThreadB : public QThread
{
public:
ThreadB () {}
void run();
};
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
private:
Ui::MainWindow *ui;
ThreadA m_a;
ThreadB m_b;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtDebug>
#include <QTime>
#include <QMutex>
QMutex mutex;
int num;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
num = 0 ;
}
MainWindow::~MainWindow()
{
delete ui;
}
void ThreadA::run()
{
while(1)
{
QMutexLocker lock(&mutex);
num++;
qDebug() << QString::number(num);
QTime t;
t.start();
while(t.elapsed() < 5000)
QCoreApplication::processEvents();
}
}
void ThreadB::run()
{
while(1)
{
QMutexLocker lock(&mutex);
num--;
qDebug() << QString::number(num);
QTime t;
t.start();
while(t.elapsed() < 1000)
QCoreApplication::processEvents();
}
}
void MainWindow::on_pushButton_clicked()
{
m_a.start();
}
void MainWindow::on_pushButton_2_clicked()
{
m_b.start();
}
QMutexLocker 定義成局部變量,當局部變量釋放時會調用QMutexLocker的析構函數,析構函數會調用解鎖操作
源碼:
inline ~QMutexLocker() { unlock(); }
inline void unlock() Q_DECL_NOTHROW
{
if ((val & quintptr(1u)) == quintptr(1u)) {
val &= ~quintptr(1u);
mutex()->unlock();
}
}