2 Bilder in unterschiedlicher Geschwindigkeit blinken lassen
-
Hallo Leute,
ich hab folgendes Problem. Ich habe einen Dialog in dem ich ein Thread starte. In dem Thread setze ich einmal ein Bitmap in schwarz auf ein PictureControl und ein Bitmap in Gelb. ( Soll ein blinken simulieren ).
In dem Thread setze ich jetzt das Gelbe Bitmap auf das Picture Control
dann mit Sleep(500); warten
dann schwarzes Bitmap auf PictureControl
dann mit Sleep(500); wieder warten
Und das wird immer wiederholt. Nun blockiert mir aber die Sleep Zeit das System und ich kann in den 500 ms weder den Dialog verschieben noch eine anderes PictureControl mit anderem Tempo blinken lassen. Gibts ne Alternative zu Sleep wo das System nicht zum "Hängen" bringt.
Danke
-
Sleep hält nur den aktuellen Thread an.
Du solltest von einem worker-Thread nicht direkt auf Controls zugreifen, sondern den Gui-Thread per PostMessage bzw SendMessage informieren.
Das könnte Probleme machen.
-
genau den soll es nicht anhalten. Gibts da keine Alternative. Ich hab einen Workerthread der per ::SendMessage auf den GUI Thread zugreift. Die Control Zugriffe sind im GUI Thread. Geht das überhaupt von einem WorkerThread direkt auf Controls ?? Bei mir ist der da eh immer abgeschmiert bei dem Versuch
-
pmb schrieb:
Geht das überhaupt von einem WorkerThread direkt auf Controls ??
Nein, ist schon richtig mit SendMessage zu arbeiten.
Wenn du im worker Thread ein Sleep hast wird auch nur der angehalten. Alle anderen Threads z.B. der Gui Thread laufen weiter.
Dann hast du ein anderes Problem. Wenn du viele Nachrichten mit SendMessage verschickst, kann es natürlich passieren, dass dein Gui Thread nichts anderes macht als diese zu bearbeiten.
Zeig vielleicht ein paar Zeilen Code. Was du im Thread machst und wie die Gui drauf reagiert.
-
Nein Du kannst nicht direkt aus deinem WorkerThread auf die Controlls zugreifen, das geht 100 pro schief. Poste alles was du an der GUI verändern willst mit PostMessage.
Wobei warum nimmst du für das wechseln der Bilder eigentlich einen Thread wenn der eh mehr wartet als was macht, Nutz doch einfach den Timer deines Dialoges dafür und stell den auf 500 ein, und setz dir nen Flag für den zustand , also welches bild gerade aktuell is unb fertig.
-
Ausschnitt Workerthread:
// Funktion OnMyMessage1 als Endlos-Schleife aufrufen for(;;) { ::SendMessage(wnd_local, WM_THREAD_BLINKEN, (WPARAM)0, (LPARAM)0); Sleep(100); }Ausschnitt GUI Thread:
m_ctl1.SetBitmap(HBITMAP(Leer)); UpdateWindow(); Sleep(500); m_ctl1.SetBitmap(HBITMAP(Gelb)); UpdateWindow(); Sleep(500); return 0;
-
Bei den Sleep(500) hängt immer alles
-
In meinem Timer werden gleichzeit mehrere andere Bidler später zum Blinken gebracht. Daher brauch ich den dafür allein. Das Blinken in dem Thread soll ganz unabhängig sein mit einer anderen Zeit
-
pmb schrieb:
Bei den Sleep(500) hängt immer alles
muß ja auch weil du gerade die GUI schlafen geschickt hast. mach das entweder im Timer (was ich als sinnvoller erachte), oder warte im deinem Worker Thread, aber in der GUI hat sleep nix verloren
-
Ich dachte du willst den Thread haben um das blinken des Controls zu steuern?
Ruf doch PostMessage im Abstand von 500ms aus dem Thread auf. Der Gui Thread zeigt dann nur das gewünschte Bild an (z.B. könntest du eine ID für WPARAM übergeben).
Wenn du im Gui Thread Sleep aufrufst ist deine Gui natürlich eingefroren.
-
Ah Supi. Jetzt klappts. Hab jetzt die Sleep(500) im Worker Thread und übergeb unterschiedliche wParam Parameter per PostMessage die ich widerrum im GUI Thread auswerte und je nach dem dann die unterschiedlich Bilder setze.
Vielen Vieln Dank
