ich bin ein Neuling in Qt, fange aber langsam an, es schätzen zu lernen. Leider hänge ich seit einigen Tagen an einem Problem, das ich alleine nicht gelöst bekomme. Vielleicht kann mir ja jemand mit seiner Erfahrung unter die Arme greifen.
Das Szenario:
Ich habe eine Schleife, in der ich irgendwas berechne, das etwas dauert. Wenn der Anwender auf den Startbutton drückt, die Schleife zu rechnen beginnt, friert solange die GUI ein. Knöpfe etc. können solange nicht gedrückt werden. Die Lösung lautet oft "bitte qApp->processEvents() benutzen".
Aber:
Nutze ich qApp->processEvents() so dauert die Schleifenabarbeitung bis zu 20mal länger, als ohne (im Vergleich 2 Sekunden vs. 40 Sekunden). Baue ich eine Abfrage in die Schleife ein, so dass nur alle 100.000 Schritte qApp->processEvents() aufgerufen wird, fängt wieder das Stottern und Haken der GUI an.
Mein Traum:
Der Anwender drückt einen Startbutton. Die Schleife fängt an zu rechnen, endet nach ca 2 bis 3 Sekunden (nicht erst nach 40). Gleichzeitig kann der Anwender, noch während die Schleife läuft, die GUI ganz normal weiter benutzen, ohne dass es "hakt" oder "stottert".
Mein Beispielcode:
Der Anwender drückt einen Button A um einen int-Wert "a" zu erhöhen. Zwei andere Buttons starten die Schleife zum Erhöhen eines int-Wertes "b" - einmal als Threadlösung, einmal ohne. Egal welchen B-Button man drückt, während die Schleife läuft, kann man nicht mehr auf den A-Button drücken. Erst wenn die B-Schleife fertig ist, wird das Drücken auf den A-Button verarbeitet. Das ist das, was ich nicht will.
Für Hilfe bin ich wirklich sehr sehr dankbar!
Mit besten Grüßen
pbooster2000
Code: Alles auswählen
#include <QThread>
#include "qt_thread.h"
int a = 0;
int b = 0;
Qt_Thread *q;
class MyThread : public QThread
{
public:
void run();
};
void MyThread::run()
{
b = 0;
while (b < 1000000){
b++;
q->setb(b);
//qApp->processEvents();
}
exec();
}
Qt_Thread::Qt_Thread(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
q = this;
connect(ui.pbIncA, SIGNAL(clicked()), this, SLOT(pbIncAClicked()));
connect(ui.pbWithoutThread, SIGNAL(clicked()), this, SLOT(pbWithoutThreadClicked()));
connect(ui.pbWithThread, SIGNAL(clicked()), this, SLOT(pbWithThreadClicked()));
}
void Qt_Thread::pbWithoutThreadClicked()
{
b = 0;
while (b < 1000000){
b++;
ui.lbb->setText( QString("%1").arg(b) );
}
}
void Qt_Thread::pbWithThreadClicked()
{
MyThread m;
m.run();
}
void Qt_Thread::setb(int b)
{
ui.lbb->setText( QString("%1").arg(b) );
}
void Qt_Thread::pbIncAClicked()
{
a++;
ui.lba->setText( QString("%1").arg(a) );
}
Qt_Thread::~Qt_Thread()
{
}