Ich habe eine Anwendung, die kontinuierlich ein Bild von einer Kamera liest und dies einem Benutzer anzeigt. Der Benutzer kann verschiedene Schieberegler wie Belichtung und Schwellenwert anpassen, um das Bild in Echtzeit zu ändern. Ich mache auch eine Reihe von Berechnungen für dieses Bild, was manchmal dazu führt, dass die GUI nicht mehr reagiert. Daher entschied ich mich, Threads zu verwenden, um die Arbeitslast zu teilen.So verwenden Sie Threads in Qt GUI
Allerdings kann ich es nicht richtig funktionieren, manchmal bekomme ich Segmentierung Fehler und eine Reihe von "Assertion` GLib-GObject-CRITICAL **: g_object_unref: Behauptung 'G_IS_OBJECT (Objekt)' fehlgeschlagen "Warnungen, wenn die Schiebereglerwerte werden geändert oder wenn ich versuche, das Bild zu speichern (Schaltfläche "Speichern" in meiner GUI), und die GUI hält manchmal an, das Bild zu aktualisieren oder friert ein, so dass Sie die Schieberegler nicht verschieben oder Tasten drücken können.
Was ich versuchte, war die Verwendung der Standard-Std :: Thread in C++, und verbinden Sie es über einen Steckplatz mit der Start-Taste.
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();
}
Wenn der Benutzer die Schieberegler Werte, die sie Variablen in meinem Manager (mngr oben) ändern ändert, dass captureImage und ProcessImages verwendet. Ich versuchte mit einem std :: mutex lock/entsperren, wenn auf eine Variable zugegriffen werden sollte, aber es änderte nichts. Ich habe versucht, Beispiele dafür zu finden, wie man das online macht, aber ich muss noch etwas finden, das eine kontinuierliche While-Schleife hat.
Ich bin ein Neuling, wenn es um Threads geht, also sag mir einfach, wenn ich mich dem falsch annähere.
Vielleicht sollten Sie besser [QThread] (http://doc.qt.io/qt-5/qthread.html) verwenden? – someoneinthebox
Hoffentlich greifen die Funktionen Ihrer mngr-Instanz nicht direkt auf QT-Widgets zu. Wenn Sie innerhalb des zweiten Threads (UpdateLabels()?) Änderungen in der GUI vornehmen wollen, müssen Sie dies auch über Signal/Slot tun! – Aconcagua
Die Updates von den Slidern werden über Signal/Slot verwaltet, und der Manager hat überhaupt keinen Zugriff auf die Qt-Widgets. Die GUI hat eine Verbindung zum Manager, aber nicht umgekehrt. UpdateLabels erhält einfach einige Bildinformationen vom Manager und aktualisiert Etiketten in der GUI. Tut mir leid, dass ich nicht geklärt habe. Ich habe versucht, in Qthread zu suchen, aber ich habe keine guten Beispiele dafür gefunden, wie es geht. – user3518432