C++ Windows Form schläft ein bei Benutzung von "Sleep"

MasterCacher

Lt. Junior Grade
Registriert
Dez. 2007
Beiträge
473
Hallo,

ich habe mit c++ CLR eine Windows Form erstellt mit 2 Anzeigen und 2 Buttons.

Button A soll erst 10 Sekunden pausieren und dann eine Ausgabe machen.
Button B soll direkt eine Ausgabe machen.

Drückt man nun Button A, kann man zwar Button B drücken, bekommt aber kein Feedback das der Button B auch wirklich gedrückt wurde und beide Ausgaben erscheinen erst, wenn die 10 Sekunden von Button A abgelaufen sind.

Wie kann ich verhindern, das Button A Einfluss auf Buttob B hat, bzw Einfluss auf die ganze Windows Form hat?
 
Ich nehme mal stark an, dass du in den Eventhandlern keinen eigenen Thread startest und so mit sleep den Haupt-Thread einschläferst.
 
Ja, genau da liegt das Problem. ich habe schwierigkeiten einen Thread zu erstellen. ohne die CLR/Windows Form bekomme ich das ja hin, aber das Visual Studio sagt mir bei CLR/Windows Form das er die Threads nicht unterstützt.

Hast du grad ein Beispiel zur Hand wie man das für die CLR/Windows Form hinbekommt?
 
danke, jetzt bin ich schon mal einen schritt weiter.
threads erstellen, starten und stoppen funktioniert soweit.

allerdings habe ich jetzt noch Probleme, falls ich versuche innerhalb des Threads die Ausgabe zu machen.
Dann kommt der Fehler: "Der Zugriff auf das Steuerelement "Beispiel_Textbox" erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde."

Ich vermute mal das Thema is recht komplex
 
Das Thema ist komplexer als es sein müsste, und zwar, weil deine GUI-Elemente nicht nur nicht threadsicher sind (was lediglich bei gleichzeitigen Zugriffen Schwierigkeiten bereiten würde), sondern zusätzlich auf einen bestimmten Thread begrenzt sind.

Eine sinnvolle Lösung für das Problem wäre, die Daten, die du verändern oder lesen möchtest, vom GUI zu entkoppeln - sprich: du packst zum Beispiel den Inhalt eines Textfeldes in einen separaten String und sorgst auch dafür, dass das Textfeld vom GUI-Thread aus aktualisiert wird, wenn der String von außen geändert wird. Muss man dann allerdings auch vernünftig absichern.
 
Der Fehler dürfte eigentlich nicht kommen, wenn du wie im verlinkten Artikel mit InvokeRequired prüfst, ob du im richtigen Thread bist.
Kann es sein, dass du die threadunsichere Methode des Artikels umgesetzt hast?
 
Dazu braucht man doch eigentlich weder sleep() noch einen separaten Thread. Die meisten GUI-Kits bieten irgendwelche Mechanismen, nach einer frei wählbaren Timeout-Periode einen Event abzusetzen, auf den man dann reagiert. Ich bin mir nahezu sicher, dass das auch mit diesem CLR-Geschmarre geht.
 
Ich würde behaupten, du suchst einfach System.Windows.Forms.Timer.

Es ist zwar nicht genau das was ich gesucht habe, aber es hilft mir doch sehr :D
In das andere Thema werde ich mich beizeiten dann mal einlesen

Vielen Dank :)
 
MasterCacher schrieb:
Es ist zwar nicht genau das was ich gesucht habe, aber es hilft mir doch sehr :D

Doch, das ist genau das, wonach du gesucht hast, auch wenn du es da noch nicht wußtest, denn für so eine simple Sache mit Threads zu hantieren wäre totaler Overkill. ;)
 

Ähnliche Themen

Antworten
18
Aufrufe
17.067
Zurück
Oben