PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : QThreads



digi
09-09-2006, 19:32
Hallo
Ich habe mit der KDevelop eine einfache Anwendung erstellt.
Und wenn ich auf einen Button klicke soll im QThread eine etwas
längere Berechnung erfolgen.Das ergebnis möchte ich unter dem Button
im QLabel "zahl" darstellen,das Programm lässt sich übersetzen wenn ich
dies "zahl->setNum(total);" ausklammere.Hat jemand eine Idee wie ich
die QLabel "zahl" zugreifen kann.

Danke


class MyThread : public QThread {
public:
MyThread( std::string a = "MyThread" );
virtual void run();
private:

std::string name;
};

MyThread::MyThread( std::string a ) : name(a)
{}

void MyThread::run()
{
int total=0;
//Hier ist eine längere Berechnung
//die ich rausgenommen habe

//dies funktioniert nicht
zahl->setNum(total);
}

void StreamWidget::total_clicked()
{
MyThread total("total");
total.start();
}

peschmae
10-09-2006, 10:16
Hallo,

wie du richtig erkannt hast kann man aus einem Thread nicht einfach so auf Objekte eines anderen Threads zugreifen.

Verwendest du Qt4? Dann lässt sich das eventuell ziemlich simpel lösen - Qt4 erlaubt nämlich auch Signal/Slot Verbindungen über Threadgrenzen hinweg, zumindest laut doku (http://doc.trolltech.com/4.2/threads.html).

Bei Qt3 musst du das irgendwie sonst machen - ich glaube mich zu erinnern dass das im C++ Programming with Qt3 Buch (http://phptr.com/content/images/0131240722/downloads/blanchette_book.pdf) beschrieben war.

MfG Peschmä

anda_skoa
11-09-2006, 18:45
Nur der Eventloop Thread, also der Haupthread der Applikation darf auf Elemente der GUI zugreifen (Widgets), bzw damit verwande Objekte (zB QPixmap)

Es gibt grundsätzlich zwei Möglichkeiten:
1) der Haupthread sieht regelmäßig in einer gemeinsamen Datenstruktur nach, ob das Ergebnis da ist (simple, aber nicht sehr effizient)

2) der Arbeitsthread sendet ein Event an ein Zielobjekt wenn er fertig ist, siehe QApplication::postEvent

Ciao,
_

digi
14-09-2006, 09:06
Danke euch,werde mir mal die Slot Programmierung anschauen.