📢 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>