Thread Kontext für connect/emit

Alles rund um die Programmierung mit Qt
Antworten
Kirby
Beiträge: 2
Registriert: 23. April 2014 18:32

Thread Kontext für connect/emit

Beitrag 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!
hilefoks
Beiträge: 144
Registriert: 13. März 2008 16:09

Re: Thread Kontext für connect/emit

Beitrag 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
Kirby
Beiträge: 2
Registriert: 23. April 2014 18:32

Re: Thread Kontext für connect/emit

Beitrag 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
Antworten