私が正しく理解していれば、ボタンAを押すとアクションA()が実行されます。ただし、GUIスレッドをブロックしてUIをフリーズしたくないため、別のスレッドでアクションA()を実行します。
ボタンを「スキップ」したくない場合は、解決策は単純であるプッシュ:
- は
context
と呼ばれるいくつかのダミーQObject
を作成します。
QObject* context = new QObject;
QThread
thread
を稼働させて実行してください。
QThread* thread = new QThread{ this }; thread->start(); ...
- その後
object->moveToThread(thread)
でthread
にcontext
を移動します。
MainWindow
クラスの信号を作成します(例:runA()
)。
A()
アクションでこの信号を接続し:
connect(this, &MainWindow::runA, context, []() { A(); });
- たびボタン「」ちょうどこの信号を発する押される:
emit runA();
信号が発せられるたびに、アクションA(
のイベント)実行されるスレッドは `threads events loop 'にポストされます。すべてのイベントは、の順番で処理されます。どんなにあなたがボタン "A" を押してどのように迅速
#pragma once
#include <QThread>
#include <QDebug>
#include <QWidget>
#include <QKeyEvent>
class MainWindow : public QWidget
{
Q_OBJECT
private:
QThread* thread;
QObject* context;
public:
MainWindow()
: thread{ new QThread },
context{ new QObject }
{
context->moveToThread(thread);
connect(this, &MainWindow::doAction, context, [this]() {
Action();
});
thread->start();
}
~MainWindow() {
context->deleteLater();
thread->deleteLater();
}
signals:
void doAction();
public:
void keyPressEvent(QKeyEvent* event)
{
int keyCode = event->key();
if(keyCode == Qt::Key_A) {
emit doAction();
}
}
void Action() {
qDebug() << "Action is being executed.";
QThread::currentThread()->sleep(2); // imitate some long calculation
}
};
。 "アクションが実行されています。"ちょうど2秒の間隔と正確にボタンが押された回数で印刷されます。
あなたのスレッドは何をすべきですか?なぜ私はあなたのためにスレッドが必要になるか分かりません。開始されたプロセスのカウンタを維持するだけです。プロセスが終了したら、['QProcess :: finished'](http://doc.qt.io/qt-5/qprocess.html#finished)シグナルを通知してください。そのような信号を受信したときにカウンタを減らしてください。カウンタが0になると、すべてのプロセスが終了したことがわかります。私はこのすべてのポイントが何であるかはわかりませんが。あなたのプログラムを少し説明してくれれば助かります。 – thuga
私はコードを更新しました。例えば、Aの2秒後にgの値を更新したいです()。しかし、私がキーをすばやく押すと、gを更新せずに新しいキーイベントを受け取り、最初の行からA()を再度実行します。だから私は新しいイベントが来るのを防ぐためにミューテックスを設定し、A()とupdate gを通過できることを確認したい。 –
プロセスを開始してから2秒後に 'g 'を更新したいのはなぜですか?なぜ即座に更新できないのですか?あなたは達成しようとしていることをより詳細に説明しなければなりません、なぜなら今は意味をなさないからです。プロセスが実行されている間にキーイベントをブロックしたい場合は、キープロセスで[プロセスの状態をチェック](http://doc.qt.io/qt-5/qprocess.html#state)してください。 – thuga