Seite 1 von 1

Thread Kontext für connect/emit

Verfasst: 3. Juni 2014 22:25
von Kirby
Hallo,

ich bin neu hier im Forum und habe ein Frage zu connect und emit.
Folgendes Problem:
Ich habe mir eine Logger Klasse geschrieben, die Log Infos unter anderem auch in ein Text Fenster posten kann. Wenn dieses Text Fenster angelegt wird, wird auch ein connect durchgeführt, um die Textstring an die Fensterklasse zu übertragen. Das sieht dann z.B. so aus:

Code: Alles auswählen

connect(this, &QMyLog::NotifyLogWindowAddText_SI, m_pLogWindow, &CMyWindowUI::OnAddText_SL);
Das absetzen einer Log Message sieht dann so aus:

Code: Alles auswählen

void QMyLog::Write(const QString& message)
	m_Mutex.tryLock();

	QString qsOut = CreateMessage(message);

        // ...

	if(m_bUseLogWindowDestination)
	{
		emit NotifyLogWindowAddText_SI(qsOut);
	}

	m_Mutex.unlock();
}
Das funktioniert soweit auch, allerdings nur wenn das emit aus dem gleichen Thread Kontext aufgerufen wird, in dem auch das connect gemacht wurde. (dem GUI Thread). Wird das emit (bzw. meine Write Funktion) aus einem anderen Thread Kontext aufgerufen, kommt das Signal nicht an.
Hat jemand vielleicht eine Idee, wie ich das Problem lösen kann?

Vielen Dank im vorraus!

Re: Thread Kontext für connect/emit

Verfasst: 8. Juni 2014 11:22
von hilefoks
Moin,

wurde in dem Thread eine eigene Event-Loop mittels exec() gestartet? Funktioniert es, wenn du beim connect explicit eine QueuedConnection vorgibst:

Code: Alles auswählen

connect(this, &QMyLog::NotifyLogWindowAddText_SI, m_pLogWindow, &CMyWindowUI::OnAddText_SL, Qt::QueuedConnection);
Hast du https://qt-project.org/doc/qt-5/threads ... ss-threads gelesen?

MfG,
Hilefoks

Re: Thread Kontext für connect/emit

Verfasst: 10. Juni 2014 18:57
von Kirby
Hallo,

danke für die Antwort. Ja, den Artikel habe ich gelesen.
Eine event loop habe ich nicht gestartet. Wenn ich Qt::QueuedConnection setze funktioniert es seltsamerweise.

MfG