24,854
社区成员
发帖
与我相关
我的任务
分享
#include <QWaitCondition>
#include <QMutex>
#include <QMutexLocker>
QMutex mutex;
QWaitCondition waitobj;
// std::unique_lock<std::mutex> lk(m);
// cv.wait(lk);
QMutexLocker locker(&mutex);
waitobj.wait(&mutex);
QMutexLocker locker(&mutex);
waitobj.wakeOne();
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QThread>
#include <QMainWindow>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
virtual void paintEvent(QPaintEvent*);
public slots:
void onRequestInput(QString prompt);
};
class WorkerThread : public QThread{
Q_OBJECT
public:
void run();
signals:
void requestInput(QString prompt);
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include <QtGui/QPainter>
#include <QTime>
#include <QApplication>
#include <QInputDialog>
#include <QLineEdit>
#include <condition_variable>
#include <mutex>
#include <QDebug>
std::mutex m;
std::condition_variable cv;
QString msg;
void WorkerThread::run() {
emit requestInput("Enter some message for WorkerThread!");
qDebug() << QString("Current time: ") << QTime::currentTime() <<QString("in thread ")
<<QThread::currentThreadId() << " waiting for input\n";
{
std::unique_lock<std::mutex> lk(m);
cv.wait(lk);
}
qDebug() << "Got input: "<< msg;
}
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
}
MainWindow::~MainWindow()
{
}
void MainWindow::paintEvent( QPaintEvent* )
{
QTime now=QTime::currentTime();
QPainter painter(this);
painter.begin(this);
QRect rc = QRect(10, 10, 180, 20);
qint64 pid= QCoreApplication::applicationPid () ;
QString msg = now.toString();
msg.append(" process id: ");
msg.append( QString::number(pid));
painter.drawText(rc, msg);
painter.end();
}
void MainWindow::onRequestInput(QString prompt){
bool ok;
msg = QInputDialog::getText(this, tr("masterz:Enter input"),prompt, QLineEdit::Normal,"", &ok);
cv.notify_one();
}
//main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
WorkerThread thread;
w.connect(&thread,SIGNAL(requestInput(const QString&)),SLOT(onRequestInput(const QString&)) );
thread.start();
return a.exec();
}