Thread & Zugriff auf GUI

Alles rund um die Programmierung mit Qt
Antworten
Melle_87
Beiträge: 31
Registriert: 1. Dezember 2010 12:41

Thread & Zugriff auf GUI

Beitrag von Melle_87 »

Hallo,
ich wollte fragen ob es irgendwie möglich ist aus einem Thread Zugriff auf die GUI zu bekommen?
Bisher habe ich immer gelesen, dass es nicht geht. Stimmt es, dass ich nur aus dem Hauptthread Zugriff auf die GUI habe?
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag von pfid »

Ja das stimmt.

http://doc.trolltech.com/4.7/threads-qobject.html

Du solltest das per Signals & Slots lösen.
Eltharion
Beiträge: 74
Registriert: 4. Mai 2006 14:42
Wohnort: Magdeburg
Kontaktdaten:

Beitrag von Eltharion »

Du kannst ja deinem Hauptthread Messages schicken oder Signale/Slots benutzen. Da kannst Du auch Daten mitschicken ohne groß Nachdenken zu müssen...

E*
Melle_87
Beiträge: 31
Registriert: 1. Dezember 2010 12:41

Beitrag von Melle_87 »

Ich benutze schon Signal&Slots. Habe aber etwas Probleme damit.
Ich würde gerne eine DirectConnection verwenden, damit der Slot sofort ausgeführt wird. Aber ich habe das Problem, dass ich das Signal aus einem Thread schicke und der Slot sich im Mainthread befindet und mit der GUI arbeitet. Da der Slot mit DirectConnection im Emitter-Thread ausgeführt wird gibt das Probleme...
Bei der QueuedConnection habe ich aber auch Probleme. Mir gehen die Nachrichten verloren. Ich weiß nicht wie ich das Lösen soll.
Hier ein kleines Beispiel:

Signal aus Thread:

Code: Alles auswählen

void thread::trace(bool zeitstempel, char *frm,...)
{
	va_list arglist;
	char buffer[500];
	strcpy(buffer, "");
	
	va_start(arglist, frm);
	vsprintf(buffer, frm, arglist);
	
	emit send_NewTrace(zeitstempel, buffer);
}
Hier Slot in Mainthread:

Code: Alles auswählen

void Mainthread::get_newTrace(bool ts, char *tr)
{
	QString str = "";
	
	if (ts)
	  str.append(QDateTime::currentDateTime().toString() + ": " + tr);
	else
	  str.append(tr);
		
	ui.textEdit_errors->append(str);	
}
Hoffe mir kann jemand weiter helfen.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Signals gehen nicht verloren.
Aber mal wieder C Grundlagen... wie lange lebt buffer[] wohl ... :roll:
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Melle_87
Beiträge: 31
Registriert: 1. Dezember 2010 12:41

Beitrag von Melle_87 »

Naja, es war mir schon klar, dass nicht die Signals an sich verloren gehen. Schließlich kam die richtige Anzahl an Signals auch im Slot an. Aber immer mit der letzten Nachricht. Klar, dass dann die erste Nachricht überschrieben wurde.
Aber ich weiß gerade trotzdem nicht wie ich das lösen kann. Denn selbst wenn buffer[] global wäre würde er ja überschrieben werden...
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Queued Signal / Slot verbindungen nutzen intern die MsgLoop.
Weiss ned wie qt Ihre verwaltet, und was fuer nachrichten er da schickt ...
Aber bei WIndows gibt es Möglichkeiten, Msg zu "überspringen".
Wenn ich aller 100ms Nachricht x Schicke, und auf der anderen seite aber nach 500 ms erst zu komme, die nachrichten abzurufen, kommts auf einstellungen draufan,ob er dann 5 mal hintereinander den Handler zu der nachricht aufruft, oder nur einmal ....

Keine Ahnung wie er das bei Qt macht, aber ganz so unwahrscheinlich halt ich es dann doch ned, dass wenn man ne Signal/Slot verbindung flutet, das da "Daten" verloren gehen ....

Bei direkt connections passiert das natuerlich nicht ....

Du kannst auch selber den thread wechseln, das aber kleinwenig komplexer, aber du hasst mehr Kontrolle !

Ciao
Antworten