[gelöst]QThread Funktionen starten per CustomEvent

Alles rund um die Programmierung mit Qt
Antworten
Alex66955
Beiträge: 56
Registriert: 23. September 2009 14:48

[gelöst]QThread Funktionen starten per CustomEvent

Beitrag 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

Code: Alles auswählen

..
	return app.exec();
..
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
Zuletzt geändert von Alex66955 am 30. August 2011 14:54, insgesamt 1-mal geändert.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Re: QThread Funktionen starten per CustomEvent

Beitrag 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..
Alex66955
Beiträge: 56
Registriert: 23. September 2009 14:48

Re: QThread Funktionen starten per CustomEvent

Beitrag 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
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Re: QThread Funktionen starten per CustomEvent

Beitrag von solarix »

Ah.. Mist.. ich bin bisher nicht in den Genuss von Qt3 gekommen :wink:

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!
Alex66955
Beiträge: 56
Registriert: 23. September 2009 14:48

[gelöst]Re: QThread Funktionen starten per CustomEvent

Beitrag 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
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Re: QThread Funktionen starten per CustomEvent

Beitrag 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..
Alex66955
Beiträge: 56
Registriert: 23. September 2009 14:48

Re: QThread Funktionen starten per CustomEvent

Beitrag 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();
}
Antworten