Seite 1 von 1
QThreads unter Linux
Verfasst: 16. November 2005 15:09
von JeFi
Hallo ich habe eine Frage zu QThreads.
Ich schreibe gerade eine kleine Animation unter Linux und nutze dazu die Klasse QThread! Nun habe ich aber das Problem, dass der Thread nicht wirklich flüssig arbeitet sprich er soll nach einem Zeichenvorgang 100 mSek warten und dann neu Zeichenen. Er braucht aber ab und zu mehrere Sekunden zum neuzeichnen! Wenn ich jetzt aber die Maus bewege läuft das ganze Flüssig! Ist das jetzt ein Fehler von mir oder leigt das an QT oder an der Thread-Implementation von Linux?
Vielen Dank im voraus
Verfasst: 16. November 2005 15:31
von Goos
Ich wuerde jetzt einfach mal auf dich tippen
Goos
Verfasst: 16. November 2005 16:25
von JeFi
Na danke auch
Hmmm hatte das gleiche Problem auch schon mal unter Java und da lief es unter Linux auch nicht sauber und als ich das gleiche Programm unter Wndows laufen lassen habe liefs perfekt! Aber wäre doch schon einwenig komisch oder dann könnte man ja nie ne Animation unter Linux erstellen!?!
Oder findest du hier einen Fehler?
fenster.h
Code: Alles auswählen
#ifndef FENSTER_H
#define FENSTER_H
#include <qwidget.h>
#include <qthread.h>
class Fenster : public QWidget, public QThread{
Q_OBJECT
public:
Fenster(QWidget *parent = 0, const char *name = 0);
~Fenster();
protected:
void run();
};
#endif
fenster.cpp
Code: Alles auswählen
#include "fenster.h"
#include <qpainter.h>
#include <qtimer.h>
Fenster::Fenster(QWidget *parent, const char *name)
: QWidget(parent, name), QThread(){
this->show();
this->start();
}
Fenster::~Fenster(){
}
void Fenster::run( ){
QPainter p(this);
for(int i=0 ; i<300 ;i++ ){
p.drawEllipse(i, i+40, 40, 40);
msleep(100);
}
}
main.cpp
Code: Alles auswählen
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <qapplication.h>
#include "fenster.h"
int main(int argc, char *argv[]){
QApplication app(argc, argv);
Fenster* f =new Fenster();
app.setMainWidget(f);
return app.exec();
}
Verfasst: 16. November 2005 16:46
von Goos
JeFi hat geschrieben:
Oder findest du hier einen Fehler?
Jo
Aus der Doku:
"In Qt, one thread is always the GUI or event thread. This is the thread that creates a QApplication object and calls QApplication::exec(). This is also the initial thread that calls main() at program start. This thread is the only thread that is allowed to perform GUI operations, including generating and receiving events from the window system."
Ausserdem sehe ich in dem Beispiel keine Notwendigkeit fuer einen separaten Thread.
Du gehst die Sache nur scheinbar etwas falsch an.
Goos
Verfasst: 16. November 2005 16:58
von JeFi
Ja das war auch nur ein kleines Beispiel! Also bitte nicht nach Sinn und Unsinn gehen

soll einfach ein einfaches Beispiel sein um mein Problem darzustellen

!
Habe das Ganze jetzt mal unter Windows compiliert und da läufts flüssig! Wieso ist das denn so da dürfte doch kein Unterschied sein oder?
Habe auch mal ein Beispiel aus einem QT Buch probiert und da ist auch das Problem unter Linux aufgetretten und die machen doch hoffendlich keine Fehler

!
Und für eine Animation sollte ich doch mit Threads arbeiten wenn ich z.B. mehrere Kreise zeichnen lasse und trotzdem noch auf Buttons usw klicken will oder sehe ich das falsch?
Verfasst: 16. November 2005 18:48
von Goos
JeFi hat geschrieben:Ja das war auch nur ein kleines Beispiel! Also bitte nicht nach Sinn und Unsinn gehen

soll einfach ein einfaches Beispiel sein um mein Problem darzustellen

!
Das darfst aber so nicht machen
JeFi hat geschrieben:
Und für eine Animation sollte ich doch mit Threads arbeiten wenn ich z.B. mehrere Kreise zeichnen lasse und trotzdem noch auf Buttons usw klicken will oder sehe ich das falsch?
Ja, du solltest in dem Fall mit Threads arbeiten. Zeichnen darfst aber trotzdem nur im Haupt-Thread. Das heisst soviel wie, dein "Animations-Thread" schickt Messages an deinen Haupt-Thread und der zeichnet dann.
Es geht bei der Animation ja auch nur darum, dein sleep aus dem Haupt-Thread rauszuhalten um den nicht zu blockieren.
Goos
Verfasst: 17. November 2005 07:35
von JeFi
Ja die Theorie klingt gut und einleuchtend aber wie soll ich das genau machen? Hast du vielleicht ein kleines Quellcode Beispiel mit Malen und Threads? Denn wenn ich jetzt zum Bsp. ein Signal an mein Hauptfenster senden würde würde das doch nichts ändern denn mein Thread würde dann auch auch in dem Objekt arbeiten oder nicht also wie könnte ich das erzwingen das dann mein Main-Thread arbeitet!?!
Verfasst: 17. November 2005 09:02
von JeFi
Hi Habe da jetzt etwas hinbekommen finde das aber sehr umständlich geht das vielleicht auch effektiver!?!
Habe Jetzt eine Klasse Thread und eine Widget und im Thread sende ich jetzt immer ein customEvent an mein Widget und jetzt läuft das ganze auch flüssig!