私は、カメラから画像を連続的に読み込み、これをユーザーに表示するアプリケーションを持っています。ユーザーは、露出やしきい値などのさまざまなスライダを調整して、画像をリアルタイムで変更することができます。また、GUIの応答が遅くなることがあるので、このイメージを計算しています。そのため、スレッドを使用してワークロードを分割することにしました。Qt GUIでスレッドを使う方法
しかし、私はそれが正しく動作するようにすることができません、時々私はセグメンテーションフォールトと "アサーション" GLib-GObject-CRITICAL **の束を得ます:g_object_unref:アサーション 'G_IS_OBJECT(オブジェクト)'スライダーの値が変更されたり、画像を保存しようとすると(GUIにボタンを保存する)、GUIが画像の更新やフリーズを停止することがあるため、スライダーを移動したりボタンを押すことができません。
私がしようとしたのは、標準のstd :: threadをC++で使用し、それをスロットからスタートボタンに接続することでした。ユーザーは、彼らが私のマネージャーで変数を変更するスライダー値captureImageとProcessImagesが使用している(上記mngr)を変更
QObject::connect(btnStart, SIGNAL(clicked()), this, SLOT(RunStartThread()));
void MainMenu::RunStartThread(){
std::thread t1;
t1= std::thread(&MainMenu::Start,this);
t1.detach();
}
void MainMenu::Start() {
run = true;
window->mngr->ReadCalibration();
window->mngr->InitializeCameras();
while (run) {
window->mngr->CaptureImage();
window->mngr->ProcessImages();
UpdateLabels();
}
window->mngr->Stop();
}
。変数をアクセスする際にstd :: mutex lock/unlockを使ってみましたが、何も変更されませんでした。私はこれをオンラインで行う方法の例を見つけようとしましたが、連続したwhileループを持つものはまだ見つけていません。
私はスレッドに関しては初心者ですので、間違った方法でこれに近づいているかどうか教えてください。
[QThread](http://doc.qt.io/qt-5/qthread.html)を使うのがよいでしょうか? – someoneinthebox
あなたのmngrインスタンスの機能はQTウィジェットに直接アクセスしないことを願っています。 2番目のスレッド(UpdateLabels()?)内からGUIの変更を行うには、signal/slot経由で行う必要があります。 – Aconcagua
スライダからの更新はsignal/slotによって管理され、マネージャはQtウィジェットにアクセスできません。 GUIにはマネージャへの接続がありますが、逆の方法ではありません。 UpdateLabelsは単にマネージャからいくつかの画像情報を取得し、GUIのラベルを更新します。申し訳ございません。 私はQthreadを調べようとしましたが、それを行う方法の良い例は見つかりませんでした。 – user3518432