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
QThreads unter Linux
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
fenster.cpp
main.cpp
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
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);
}
}
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();
}
JoJeFi hat geschrieben: Oder findest du hier einen Fehler?
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
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?
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?
Das darfst aber so nicht machenJeFi hat geschrieben:Ja das war auch nur ein kleines Beispiel! Also bitte nicht nach Sinn und Unsinn gehensoll einfach ein einfaches Beispiel sein um mein Problem darzustellen
!
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.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?
Es geht bei der Animation ja auch nur darum, dein sleep aus dem Haupt-Thread rauszuhalten um den nicht zu blockieren.
Goos
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!?!