Seite 1 von 1
Thread & Zugriff auf GUI
Verfasst: 9. Dezember 2010 13:35
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?
Verfasst: 9. Dezember 2010 13:44
von pfid
Ja das stimmt.
http://doc.trolltech.com/4.7/threads-qobject.html
Du solltest das per Signals & Slots lösen.
Verfasst: 9. Dezember 2010 13:45
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*
Verfasst: 9. Dezember 2010 14:06
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.
Verfasst: 9. Dezember 2010 14:15
von Christian81
Signals gehen nicht verloren.
Aber mal wieder C Grundlagen... wie lange lebt buffer[] wohl ...

Verfasst: 9. Dezember 2010 14:22
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...
Verfasst: 9. Dezember 2010 14:26
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