Seite 1 von 1

Pointer Übergeben

Verfasst: 2. April 2009 22:03
von geograman
Moin,

Habe folgendes Problem:

Ich bin ich meiner gui Klasse und rufe einen Multithread auf.

Dieser soll sich dann darum kümmern das veschiedene Objekte zb ein QLabel von der gui Klasse manipuliert wird also zb ein anderer Text eingetragen wird.

Nur weis ich jetzt nicht wie man den Pointer der Klasse dem Thread richtig übergiebt sodas ich dann in meinem Thread auf die gui Klasse zugreifen kann.

Thx :wink:

Re: Pointer Übergeben

Verfasst: 2. April 2009 22:22
von franzf
geograman hat geschrieben:Ich bin ich meiner gui Klasse und rufe einen Multithread auf.
Ui, will auch. Kannst du mir sagen was das ist und wie es geht? :D
Dieser soll sich dann darum kümmern das veschiedene Objekte zb ein QLabel von der gui Klasse manipuliert wird also zb ein anderer Text eingetragen wird.
setText() usw. resultieren in einem paintEvent(). Zeichnen geht aber NUR IM HAUPTTHREAD! Du kannst in einem anderen als dem GUI-Thread ein Pixmap errechnen, und wenn das fertig ist, kann das der GUI-Thread auf ein Label setzen.
Nur weis ich jetzt nicht wie man den Pointer der Klasse dem Thread richtig übergiebt sodas ich dann in meinem Thread auf die gui Klasse zugreifen kann.
Einen Member-pointer in der Klasse auf das zu manipulierende Objekt, welches per setter oder gleich im Konstruktor mitgegeben wird.

Und immer schön locken, damit du verhinderst, dass das Objekt von mehreren Threads gleichzeitig manipuliert werden kann, gell?

Grüße
Franz

Verfasst: 3. April 2009 08:50
von pfid

Code: Alles auswählen


int MyMainClass::init()
{
   ...
   connect(myMultiThread, SIGNAL(changeText(const QString&)), this, SLOT(onThreadTextChange(const QString&)));
}

void MyMainClass:onThreadTextChange(const QString& text)
{
   myLabel->setText(text);
}

Code: Alles auswählen


int MyMultiThread::run()
{
   ...
   emit changeText("my Label Text");
}
Multithread, geil :D

[edit] Wieso fangt ihr eigentlich immer direkt an, solch komplexe Themen in euren Programmen zu verwenden, wenn einfache C++ Grundlagen noch fehlen? Ich meine, Threadprogrammierung ist wohl nicht gerade ein triviales Thema, und für die meisten Anwendungen auch vollkommen überdimensioniert oder zu kompliziert.

my 2ct

pointer übergeben

Verfasst: 3. April 2009 19:15
von geograman
Hi,

danke ihr zwei :) , es ist leider umbedingt erforderlich das ich multithreds benutze da ich verschiede funktionen aus der winapi benutze die gleichzeiti ablaufen müssen wobei trotzdem die gui nicht frezzen darf.

Das hat auch bis jetzt ganz wunderbar funktioniert :)

Leider hab ich in letzter zeit viel Java programmieren müssen wo das mit den Klassen ein wenig leicher gestaltet ist und irgendwie komm ich andauernd in Teufelsküche mit beiden Sprachen weils hald eben doch 2 ganz schön verschiedene Stiefel sind >.<

Wie dem auch sei nun bin ich vollends verwirrt : D

Wieso kann ich nicht von einer andere Klasse aus auf die GUI Klasse zu greifen um dort zb ein Textfeld zuverändern?

Heißt das jetzt das jede Veränderung der Widget in der GUI Klasse selbst stehn muss ?

Re: pointer übergeben

Verfasst: 3. April 2009 19:33
von franzf
geograman hat geschrieben:Wieso kann ich nicht von einer andere Klasse aus auf die GUI Klasse zu greifen um dort zb ein Textfeld zuverändern?

Heißt das jetzt das jede Veränderung der Widget in der GUI Klasse selbst stehn muss ?
Nicht GUI-Klasse sonder Thread! Im Normalfall erstellst du in deiner Main ein Widget, machst ein show(), und startest die Event-Loop mittels QApplication::exec(). Das ist dein Haupt-Thread - der Gui-Thread.
Startest du nun neu Threads, die irgend etwas berechnen sollen, und die Gui nicht einfrieren darf, sind diese Nebenthreads, und dürfen nichts zeichnen. Qt hat diese Restriktion geschaffen, da z.B. die WinAPI sowas zulässt, man aber 100% irgend wo einen ziemlichen Crash baut, und somit selbst schauen muss, dass nur in einem Thread gezeichnet wird.

Aber wenn es sich eh nur um WinAPI-Sachen dreht, hast du eh gute Aussichten, nix mittels Qt zu zeichnen ;) (K.A. wie es aussieht, wenn du dann mit QinAPI was malst, nehm aber an das geht auch irgend wo in die Hose - hab aber nur Erfahrung mit Linux...)
Dann ist es sicher möglich eigene Signals aus deinem Neben-Thread loszuschicken, wenn ein Ereignis dies erfordert. Auf dieses kannst du im Gui-Thread sehr wohl reagieren, und dort dann etwas zeichnen.