📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
ページの作成:「== 概要 == QMLとC++を連携させたマルチスレッドの実装手順、および、<code>WorkerScript</code>を使用したマルチスレッドの実装手順を…」 |
編集の要約なし |
||
| 144行目: | 144行目: | ||
now = new Date(); | now = new Date(); | ||
}while((now - start) < msec); | }while((now - start) < msec); | ||
} | |||
</syntaxhighlight> | |||
<br><br> | |||
== QMLとC++を連携させたマルチスレッド == | |||
QObjectクラスを継承したクラスを作成およびそのクラス内にワーカースレッドを作成して、メインスレッドをブロックせずにQML側と非同期に通信することができる。<br> | |||
<br> | |||
以下の例では、ワーカースレッドを5秒停止かつシグナルを発信しながら、メインスレッドで画面を更新し続けている。<br> | |||
ワーカースレッドの実行中において、一時停止、中断、制御は一切できないため、それらが必要な場合はノンブロッキングワーカースレッドを実装する必要がある。 | |||
<syntaxhighlight lang="c++"> | |||
// CController.h | |||
#include <QThread> | |||
#include <QString> | |||
#include <thread> | |||
#include <memory> | |||
class CWorkerThread : public QObject | |||
{ | |||
Q_OBJECT | |||
public slots: | |||
void doWork() | |||
{ | |||
int i = 0; | |||
while (i < 10) | |||
{ | |||
emit result(i++, tr("hoge")); | |||
std::this_thread::sleep_for(std::chrono::milliseconds(500)); | |||
} | |||
} | |||
signals: | |||
void result(int r, QString s); | |||
}; | |||
class CController : public QObject | |||
{ | |||
Q_OBJECT | |||
public: | |||
Controller() | |||
{ | |||
m_pWorker = std::make_unique<CWorkerThread>(); | |||
m_pThread = std::make_unique<QThread>(); | |||
m_pWorker->moveToThread(m_pThread.get()); | |||
connect(this, SIGNAL(start()), m_pWorker.get(), SLOT(doWork())); | |||
connect(m_pWorker.get(), SIGNAL(result(int,QString)), this, SIGNAL(result(int,QString))); | |||
m_pThread->start(); | |||
} | |||
private: | |||
std::unique_ptr<CWorkerThread> m_pWorker; | |||
std::unique_ptr<QThread> m_pThread; | |||
signals: | |||
void start(); | |||
void result(int r, QString s); | |||
}; | |||
</syntaxhighlight> | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
// main.cpp | |||
// ...略 | |||
qmlRegisterType<CController>("Controller", 1, 0, "CController"); | |||
QQmlApplicationEngine engine; | |||
const QUrl url(QStringLiteral("qrc:/main.qml")); | |||
// ...略 | |||
</syntaxhighlight> | |||
<br> | |||
<syntaxhighlight lang="qml"> | |||
// main.qml | |||
import QtQuick 2.15 | |||
import QtQuick.Window 2.15 | |||
import QtQuick.Controls 2.15 | |||
import Controller 1.0 | |||
ApplicationWindow { | |||
id: mainWindow | |||
// ...略 | |||
CController { | |||
id: mainController; | |||
} | |||
Column { | |||
Button { | |||
id: start | |||
onClicked: { | |||
mainController.start() | |||
} | |||
} | |||
Text { | |||
id: res | |||
} | |||
} | |||
// Result of Slot | |||
Connections { | |||
target: mainController | |||
function onResult(r, s) { | |||
res.text = r + qsTr(":") s; | |||
} | |||
} | |||
// ...略 | |||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||