[gelöst] Cannot move to target thread

Alles rund um die Programmierung mit Qt
Antworten
butze
Beiträge: 39
Registriert: 7. Mai 2007 23:01

[gelöst] Cannot move to target thread

Beitrag von butze »

hi!

Benutze MSVC, WinXP, QT 4.3.3 (static) mit dem QT plugin. Mit dem Designer hab ich eine kleine GUI gebaut. Das Problem besteht nun darin, dass beim Debuggen bei return a.exec(); das Programm abstürzt:
QObject::moveToThread: Current thread <01479598> is not the object's thread <003D4A0>.
Cannot move to target thread <003D4A0>

Qt has caught an exception thrown from an event handler. Throwing exceptions from an event handler is noch supported in Qt. You must reimplement QApplication::notify() and catch all exceptions there.
Weiß jemand, woran das liegen kann? Benutze nur Qpushbutton clicked und checkbox toggled Signal/ Slots.

Über google hab ich leider nichtmal rausbekommen, in welche Richtung ich suchen soll :(


edit:

ganz merkwürdig ist auch, dass sich das Programm nach einem Neustart manchmal 1-2 mal ausführen lässt, bevor der Fehler wieder kommt.
Zuletzt geändert von butze am 28. April 2008 08:40, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Im debug-Modus bauen und debuggen. Mit dem Backtrace kann man dann sehen was los ist (hoffentlich). Ausserdem ist ein kleines Beispiel bzw. etwas code angebracht da wir (immer noch) keine Glaskugel bekommen haben.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
SchranZViruS
Beiträge: 31
Registriert: 3. Februar 2008 01:33

Beitrag von SchranZViruS »

QObject::moveToThread: Current thread <01479598> is not the object's thread <003D4A0>
Du kannst ein Object nur vom aktuellen Thread in einen anderen "schieben" (http://doc.trolltech.com/4.3/qobject.html#moveToThread):
... In other words, this function can only "push" an object from the current thread to another thread, it cannot "pull" an object from any arbitrary thread to the current thread.
butze
Beiträge: 39
Registriert: 7. Mai 2007 23:01

Beitrag von butze »

die App wurde im Debug Modus erstellt. Mit Threads hantiere ich gar nicht herum.

die GUI wird aufgebaut und erst bei return a.exec(); kommt der Fehler (erscheint in der command line). Sobald ich auf die GUI klicke, stürzt das Programm ganz ab.

hab die kleine Applikation als jpg angefügt. Jeder Button hat einen Slot, indem ein Mikrocontroller Anweisungen bekommt.


der Code sieht so aus (etwas gekürzt, aber viel mehr isses nicht)

Ich vermute mal, dass irgendwas mit den Signal Slots nicht hinhaut - kanns aber auch nicht begründen. :roll:

Code: Alles auswählen

#include "adm_test.h"

ADM_Test::ADM_Test(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
	ui.setupUi(this);
}

ADM_Test::~ADM_Test()
{
	timer = new QTimer();
	timer->setInterval(500);
	connect(timer, SIGNAL(timeout()), this, SLOT(on_pushButton_refresh_clicked()));

	init()
}


bool ADM_Test::init()
{
  \\baue Verbindung zur Hardware auf
}


void ADM_Test::on_groupBox_HWMON_toggled(bool)
{
	if (ui.groupBox_HWMON->isChecked())
		ui.groupBox_EEPROM->setChecked(false);

	if(ui.radioButton_per_upd->isChecked())
		{
			ui.radioButton_per_upd->setChecked(false);
			myBoard_p->setHWMonPeriodicUpdate(false);
			ui.radioButton_per_upd->setDisabled(true);
		}
}

void ADM_Test::on_groupBox_EEPROM_toggled(bool)
{
	if (ui.groupBox_EEPROM->isChecked())
		ui.groupBox_HWMON->setChecked(false);
}

void ADM_Test::on_pushButton_refresh_clicked()
{
    \\refreshen der Anzeigen
}

void ADM_Test::on_radioButton_per_upd_toggled(bool)
{
	if(ui.radioButton_per_upd->isChecked())
	{
		std::cout <<"periodic update enabled!\n";
		myBoard_p->setHWMonPeriodicUpdate(true);
		timer->start();
	}

	else
	{
		std::cout <<"periodic update disabled!\n";
		timer->stop();
		myBoard_p->setHWMonPeriodicUpdate(false);
	}
}

void ADM_Test::on_pushButton_read_clicked()
{
	
}

void ADM_Test::on_pushButton_write_clicked()
{
	
}

void ADM_Test::on_pushButton_delete_clicked()
{
	
}

void ADM_Test::on_pushButton_delete_bram_clicked()
{
	
}

Reicht das erstmal für ne Idee? Kann gerne mehr code liefern
Dateianhänge
screen.JPG
screen.JPG (38.34 KiB) 7364 mal betrachtet
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Im dtor ein new QTimer und connect???
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
SchranZViruS
Beiträge: 31
Registriert: 3. Februar 2008 01:33

Beitrag von SchranZViruS »

ohja...

also das new würde ja noch gehn, wenn du this nicht als parent holst, aber das connect wird müll, weil du this als ziel angibst und überleg mal, this bist du gerade am löschen?!
butze
Beiträge: 39
Registriert: 7. Mai 2007 23:01

Beitrag von butze »

oh :)

hab das wohl falsch kopiert, als ich ein neues Projekt angelegt, und die GUI komplett neu zusammengeklickt habe.


Habs nun wieder richtig im Konstruktor stehen.

Aber es geht immer noch nicht. Zum Test hab ich den QTImer komplett weggelassen. Es zeigt sich dennoch (ab dem 2. Programmstart nach einem Neustart) das Verhalten:

- Fehlermeldung mit moveToThread wird in der Konsole ausgegeben
- beim Klicken auf beliebige Knöpfe stürzt das Programm ab.
- Die Haken bei den Groupboxen lassen sich problemlos aktivieren und deaktivieren. Dabei wird auch das jeweils andere Fenster ink. Knöpfe deaktiviert.


nu steh ich wieder auffem Schlauch :shock:
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Nimm endlich einen Debugger und schau nach!
Und wenn nicht - gib uns ein minimal compilierbares Beispiel damit wir es uns anschauen können.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
butze
Beiträge: 39
Registriert: 7. Mai 2007 23:01

Beitrag von butze »

er stürzt immer in der main bei return a.exec(); ab.

Genauer QCoreApplication.cpp (Z.744)

Code: Alles auswählen

  threadData->quitNow = false;
    QEventLoop eventLoop;
    self->d_func()->in_exec = true;
    int returnCode = eventLoop.exec();     //hier
    threadData->quitNow = false;
Genauer QEventLoop (Z. 171)

Code: Alles auswählen

#else
    try {
        while (!d->exit)
            processEvents(flags | WaitForMoreEvents | ProcessEventsFlag(QEventLoop::DeferredDeletion));    //hier
    } catch (...) {
        qWarning("Qt has caught an exception thrown from an event handler. Throwing\n"
                 "exceptions from an event handler is not supported in Qt. You must\n"
                 "reimplement QApplication::notify() and catch all exceptions there.\n");
        throw;
mein vereinfachter Code ist angehängt, wäre cool, wenn jemand den anschauen würde.
Dateianhänge
adm_test.ui
(13.84 KiB) 198-mal heruntergeladen
adm_test.cpp
(2.12 KiB) 201-mal heruntergeladen
adm_test.h
(745 Bytes) 174-mal heruntergeladen
butze
Beiträge: 39
Registriert: 7. Mai 2007 23:01

Beitrag von butze »

...merkwürdig. Auf meinem Heim-PC läuft das Programm einwandfrei.... werde Montag auf dem Arbeitsrechner QT neu kompilieren und mich dann nochmal melden
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Leider bin ich noch nicht dazu gekommen es zu testen. Ggf. compilierst Du gegen eine andere Qt-Version als dann gelinkt wird? Oder sowas in der Art :)
Wenn es dann immer noch auftritt, bitte melden.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Ich habs getestet,
Gentoo Linux, GCC-4.1.2, Qt-4.4.0_snapshot-20080325
Ich hab keinerlei Probleme
butze
Beiträge: 39
Registriert: 7. Mai 2007 23:01

Beitrag von butze »

nach der Installation des MS .net Pack 3 ging es irgendwie... keine Ahnung warum das nicht ohne gehen soll :?
Antworten