最近、対話型インターフェースの更新プログラムを作成しました。命令を受け取ったスレッドでインターフェースリフレッシュ関数を処理すると、エラーが報告されインターフェースがリフレッシュされないことがわかります。Baidu を調べたところ、スレッドの安全性に問題があることがわかりました。子スレッドはメインスレッドを処理できません。関連する紹介がたくさんあることが分かりましたが、1つの方法として、Connect Signalスロットを使用して処理する方法があります。1 つの方法は、moveToThread でそれを処理することです。connectメソッドだけは完了したのですが、moveToThreadの検証が通らなかったのですが、検証を通った方はいらっしゃいますか?アドバイスをお願いします。
以下は私のコード構造です。
1 つは、挿入関数を含むインターフェイス モデルです。
beginInsertRows(QModelIndex(),index,index);
m_dataList.insert(index, data);
endInsertRows(); //これが例外の理由です
1 つは、UI からの命令を受け取る命令通信スレッドです。それからそれを処理します。
while(isRunning())
{
スイッチ(cmd)
{
ケースの挿入データ:
QVariantデータ(json);
signalToUpdate(data) を発行します。
壊す;
}
}
接続関連スロット機能を使用します。
connect(this,&CmdProcess::signalToUpdate,this,&CmdProcess::startToUpdate);
void CmdProcess::startToUpdate(QVariant データ)
{
QJsonObject msg = data.toJsonObject(); //QJsonObject を使用するには型変換が必要です。
追加(メッセージ);
スレッドが必要な理由については、
主な理由は、インターフェイスのフリーズを引き起こす直接コールバックでのブロックを防ぐためです。