Seite 1 von 1
[gelöst]QThread Funktionen starten per CustomEvent
Verfasst: 29. August 2011 10:54
von Alex66955
Hallo,
Zuerst mein System:
Qt: 3.3.2 Embedded (ohne QextSerialPort)
System: Linux 2.6.9
Architektur: arm
Ich haben eine Konsolenanwendung mit einer Event-Loop
und ein Worker Thread
Code: Alles auswählen
..
Worker::run(){
//Initialisiert einige dinge
}
Worker::customEvent(QCustomEvent *event) {
// im Kontext von Aufgerufenen Thread
int type = event->type();
switch (type) {
case 1: {
Funktion1();
break;
}
}
}
..
starte ich nun Funktionen des Threads per CustomEvent werden die Funktionen des Workers aus dem Kontext des aufgerufenen Threads hier main gestartet...Wie bekomme ich es hin das die Funktionen im Kontext des selbigen Threads ausgeführt werden.
Innerhalb des Thread bzw. durch starten der Funktionen mit einem Signal funktioniert leider auch nicht.
Starten des Threads
Code: Alles auswählen
...
Worker= new Worker(this);
Worker->start();
// In der Run Methode wird ein Mutex eingesetzt um zu verhindern das postEvent vor start ausgeführt wird
QApplication::postEvent(sensorWorker, new StartThreadEvent("",SensorWorker::WorkerStart));
...
[EDIT]: Hätte ich eine Funktion wie MoveToThread könnte ich das erzeugte Event zu dem WorkerThread schieben um es aus diesem Kontext auszuführen
Gruß Alex
Re: QThread Funktionen starten per CustomEvent
Verfasst: 29. August 2011 13:02
von solarix
Wird denn der Thread selbst zu sich verschoben? Wenn nicht, lebt die Thread-Instanz im MainThread.. und dann wird der Event dem Eventloop des MainThreads zugeschoben...
BTW: warum nicht gleich mit Signals/Slots..? Warum der Umweg über Events?
hth..
Re: QThread Funktionen starten per CustomEvent
Verfasst: 29. August 2011 13:21
von Alex66955
solarix hat geschrieben:Wird denn der Thread selbst zu sich verschoben? Wenn nicht, lebt die Thread-Instanz im MainThread.. und dann wird der Event dem Eventloop des MainThreads zugeschoben...
BTW: warum nicht gleich mit Signals/Slots..? Warum der Umweg über Events?
hth..
Wie gesagt ich arbeite mit QT 3.3, Signal/Slots Funktionieren nicht Thread übergreifend! Und ich habe auch keine Funktion gefunden mit dieser ich den Thread zu sich selbst schieben kann.
Gruß
alex
Re: QThread Funktionen starten per CustomEvent
Verfasst: 29. August 2011 13:54
von solarix
Ah.. Mist.. ich bin bisher nicht in den Genuss von Qt3 gekommen
Wobei ich da an deiner Stelle nicht lange fackeln würde.. wenn es Qt3 nicht kann, kannst du ja selbst eine mutex-geschützte QList von Events (von Qt oder auch eine eigene Klasse) als "Auftragsbuffer" verwenden...
hth!
[gelöst]Re: QThread Funktionen starten per CustomEvent
Verfasst: 29. August 2011 15:30
von Alex66955
solarix hat geschrieben:
Wobei ich da an deiner Stelle nicht lange fackeln würde.. wenn es Qt3 nicht kann, kannst du ja selbst eine mutex-geschützte QList von Events (von Qt oder auch eine eigene Klasse) als "Auftragsbuffer" verwenden...
hth!
Ja musste mich auch erst umorientieren aber mein System gibt leider nicht mehr her. Zumindest nicht ohne entsprechenden Arbeitsaufwand.
Das mit der Liste sollte funktionieren. Ist aber meiner Meinung nach sehr unschön... naja hauptsache funktional
[EDIT]: Meintest du mit der liste, eine pointer liste die ich vom Main Thread an den Worker Thread übergeben und dieser dann CustomEvents erzeugt und in der Liste abspeichert? Da ja die Custom Events im Worker Thread erzeugt wurden werden sie auch in dessen Kontext ausgeführt. Oder habe ich das falsch verstanden
Gruß Alex
Re: QThread Funktionen starten per CustomEvent
Verfasst: 29. August 2011 16:19
von solarix
Naja.. genau genommen werden "CustomEvents" gar nie "ausgeführt", sondern nur "bearbeitet" (lesen/schreiben). Der Context spielt von daher gar keine Rolle.. was ich mit der Liste meine ist einfach eine klassische Auftragsliste (in Qt3 vermutlich die "QPtrList", welche dann per Polling geprüft wird (Qt4 macht im EventLoop ja nichts anderes).
Also so in etwa
Code: Alles auswählen
// fuer den GUI/Main-Thread
void Worker::addEvent(QCustomEvent *event) {
mutex.lock();
mEvents.append(event);
mutex.unlock();
}
// fuer den Thread (run-Methode)
QCustomEvent* Worker::nextEvent() {
QCustomEvent *e = NULL;
mutex.lock();
if (!mEvents.isEmpty())
e = mEvents.takeFirst();
mutex.unlock();
return e;
}
Aber das kannst du handhaben wie du möchtest.. das geht natürlich auch mit einer Liste von Events (anstelle eines einzelnen) oder z.B. auch gleich mit einer eigenen "Eventklasse" (z.B. "WorkerJob" anstelle "QCustomEvent").
hth..
Re: QThread Funktionen starten per CustomEvent
Verfasst: 30. August 2011 14:54
von Alex66955
Okay hab ich so verstanden.
Großes Danke
Nochmal kurze mein aktueller Code falls jemand das selbe Problem hatte wie ich.
main.cpp
Code: Alles auswählen
ptrlist = new QPtrKist<QEvent>
listMutex = new QMutex;
ptrlist->setAutoDelete(true);
worker = new WorkerThread(ptrlist, listMutex);
worker->start();
//Auftrag übergeben
listMutex.lock();
ptrlist.append(new myCustomEvent(Parameter, typ));
listMutex.unlock();
Worker.cpp
Code: Alles auswählen
void WorkerThread::run() {
while(isStopped== false) {
listMutex.lock();
if(jobList->isEmpty() == false) {
QEvent *e = NULL;
e = jobList->take();
listMutex.unlock();
int type = e->type();
switch (type) {
case 1: DO SOMETHING;
}
}
listMutex.unlock();
}