Seite 1 von 1

[gelöst] Qt und Winapi Threads

Verfasst: 5. Januar 2010 09:16
von finalcu
Hallo Zusammen,

ich habe folgendes Problem und bin auf die Hilfe von Experten angewiesen:

in meinem Main-File starte ich das GUI:

Code: Alles auswählen

QApplication app(argc, argv);
GUI = new myGUI();
GUI->show();
app.exec();
parallel laufen zwei threads, die mit der WINAPI erstellt wurden (nicht QThread) und die über einen Pointer ebenfalls auf das GUI zugreifen können:

Thread1:

Code: Alles auswählen

GUI_ptr->writeToLog("Thread 1");
Thread2:

Code: Alles auswählen

GUI_ptr->writeToLog("Thread 2");
wobei die Funktion writeToLog() ein Member der GUI Klasse ist und wie folgt aussieht:

Code: Alles auswählen

void myGUI::writeToLog(QString line) {
	write_log_mutex.lock();
	QTime c_time = QTime::currentTime();
	ui.log->insertPlainText("[" + c_time.toString("hh:mm:ss") + "] " + line);
	write_log_mutex.unlock();
	return;
}
und der write_log_mutex wurde in der GUI Klasse under private mittels QMutex deklariert.

Und nun das Problem: Das Programm startet und alle writeToLog() Aufrufe, die vor GUI->show() (in main) ausgeführt werden, werden auch angezeigt. Alles was danach passiert wird im GUI nicht mehr angezeigt und das Programm stürzt meistens unerwartet ab. Diese Abstürze werden durch den Aufruf writeToLog() verursacht (da das Programm nicht abstürzt wenn ich die Zeile ui.log->insertPlainText(...) auskommentiere) als ob der Mutex nicht funktionieren würde...

Ich hoffe mir kann irgendeiner weiterhelfen.

Besten Dank,
finalcu

Verfasst: 5. Januar 2010 09:21
von AuE
In der Ausgabe sollte stehen das nur der GUI Thread zugriff auf die GUI hat. Das einfachste wäre wenn du von den Threads aus ein Signal sendest. Das kannst du ja auch wie gehabt machen. In der writeXX Funktion machst ein emit writeToField(QString toWrite); diese Signale sind via Qt_quued Connection an Slots der Klasse gebunden und werden dann auch im Context des GUI Threads aufgerufen.

hth

Verfasst: 5. Januar 2010 09:31
von finalcu
EDIT: Vielen Dank. Dein Vorschlag klappt einwandfrei!

Gruss,
finalcu