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?
Thread & Zugriff auf GUI
Ja das stimmt.
http://doc.trolltech.com/4.7/threads-qobject.html
Du solltest das per Signals & Slots lösen.
http://doc.trolltech.com/4.7/threads-qobject.html
Du solltest das per Signals & Slots lösen.
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:
Hier Slot in Mainthread:
Hoffe mir kann jemand weiter helfen.
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);
}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);
}-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
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...
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...
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
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