[gelöst] Qt und Winapi Threads

Alles rund um die Programmierung mit Qt
Antworten
finalcu
Beiträge: 6
Registriert: 4. Januar 2010 17:03

[gelöst] Qt und Winapi Threads

Beitrag 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
Zuletzt geändert von finalcu am 5. Januar 2010 10:54, insgesamt 1-mal geändert.
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag 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
finalcu
Beiträge: 6
Registriert: 4. Januar 2010 17:03

Beitrag von finalcu »

EDIT: Vielen Dank. Dein Vorschlag klappt einwandfrei!

Gruss,
finalcu
Antworten