Windows Forms Ereignisse
-
Hmm... ja leuchtet ein nur..
DWORD zwischensumme; DWORD resultat; DWORD irgendwas; //--------------------------------------------------------------------------- void __fastcall TForm1::Timer1Timer(TObject *Sender) { zwischensumme = 1; irgendwas = zwischensumme; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { zwischensumme = 5; Form3->ShowModal(); resultat = zwischensumme; } //---------------------------------------------------------------------------Wenn ich das Programmiere kann ich mir ja nie sicher sein, ob die Daten, in diesem Beispiel die Variabel zwischensumme nicht durch irgend ein anderes, plötzlich auftretendes Ereigniss geändert wird.
Wenn im obigen Beispiel nach dem Laden von Form3 ein Timerereigniss ausgelöst wird, ist die Variabel resultat nach dem Schliessen von Form3 1 und nicht wie erwartet 5.
Beim Anzeigen einer weiteren Form ist das Ganze noch durch erhöhten Aufwand zu korrigieren, was aber wenn das Ereigniss unerwartet durch eine externe Hardware oder sonstwas ausgelöst wird.
Muss ich jedesmal beim abarbeiten eines Ereignisses alle anderen Ereignissquellen deaktivieren ? Wäre ja doch etwas umständlich, wie löst man dieses Problem ??
-
noobc schrieb:
Wenn ich das Programmiere kann ich mir ja nie sicher sein, ob die Daten, in diesem Beispiel die Variabel zwischensumme nicht durch irgend ein anderes, plötzlich auftretendes Ereigniss geändert wird.
Diese "plötzlich auftretenden Ereignisse" treten ja nicht aus heiterem Himmel auf, sondern nur, wenn du sie entsprechend programmiert hast. Und dabei musst du halt berücksichtigen, welche Auswirkungen das an anderer Stelle haben kann.
-
Wie ich jetzt festgestellt habe, tritt das Problem ja bei ShowModal auf, wenn ich jedoch aus der Windows.h die Funktion Sleep() nehme, bleibt selbst der Timer still, wie unterscheidet sich dann ShowModal von Sleep(), beide Befehle stoppen ja das Programm an der Stelle.
Zu der Sache mit den plötzlichen Ereignissen zählen bei mir zum Beispiel ein SerialPort Ereigniss, welches ausgelöst wird, sobald die Serielle Schnittstelle Daten empfangen hat.
Wenn ich daran einen Mikrocontroller anhänge, welcher auf Knopfdruck daten an die Schnittstelle sendet ist das für mich ein unerwartetes oder zumindest plötzlich auftretendes Ereigniss, welches ich ja nicht nach dem Programmcode richten kann.
-
Von diesem Ereignis bekommt dein Programm doch aber nur etwas mit, weil du eine entsprechende Abfrage oder EventHandler eingebaut hast. Also nichts mit plötzlich und unerwartet.
Wenn am SerialPort was eintrifft dann wertest du im entsprechenden Event halt den Empfangspuffer aus. Ein Konflikt kann dabei eigentlich nicht auftreten, denn es macht ja keinen Sinn, in den Puffer auch von anderer Stelle im Programm aus zu schreiben.ShowModal stoppt nichts sondern blockiert nur Benutzereinwirkungen auf die "Hintergrund-Form". Sleep hält das gesamte Programm an.
-
Ok, langsam blicke ich etwas durch, nur die Funktion ShowModal begreife ich nicht komplett.
Bei meinem jetztigen Wissensstand muss ich mir vorstellen, dass die Ereignissfunktion bei ShowModal verlassen wird und somit der nachfolgende Text in der Funktion übersprungen wird, damit die anderen Ereignissfunktionen trotzdehm ausgeführt werden können.
Bei Sleep() wird die Funktion jedoch nicht verlassen, sondern nur um eine bestimmte Zeit angehalten, was dann die Abarbeitung anderer Ereignisse blockiert.
-
Hallo
Alles was bei ShowModal um Unterschied zu Show getan wird ist zusätzlich den Userinput aller Art auf das untere Form zu verhindern. Den Effekt kannst du sogar selber erzeugen indem du bei einem Form Enabled auf false setzt.
Dadurch wird aber nicht verhindert das Windows-Messages (Userinputs sind nur ein Teil der Windows-Messages) vom unterem Form verarbeitet werden. Genausowenig wie das zwei einzelnen nebeneinanderlaufenden Programmen verhindert wird.sleep hingegen hält das Program ganz an. Es werden überhaupt keine Windows-Messages verarbeitet, das ganze Programm "friert ein".
bis bald
akari
-
Puh, braucht wohl etwas Nerven mit mir hier im Forum

Wenn ich nun folgendes versuche
void __fastcall TForm1::Button1Click(TObject *Sender) { Form3->ShowModal(); zwischenresultat = 3; }und beim Debugger einen Haltepunkt bei zwischenresultat = 3; setze, wird der Haltepunkt erst erreicht, wenn ich Form3 wieder schliesse.
Wenn ich jedoch
void __fastcall TForm1::Button1Click(TObject *Sender) { Form3->Show(); this->Enabled = false; // Hauptfenster disable zwischenresultat = 3; }schreibe, wird der Haltepunkt sofot nach Knopfdruck erreicht.
Wenn ich Sleep() anstelle von ShowModal() setze wird das ganze Programm unterbrochen.
Springt das Programm bei ShowModal, solange ModalResult null ist aus der Funktion raus, oder wie muss ich mir das vorstellen, was macht denn ShowModal anders als Sleep, beide unterbrechen ja den Programmablauf.
-
Hallo
Für alle drei Varianten gilt : Dein Programm arbeitet rein sequentiell.
Selbst beim Beispiel mit Show. Es wird zuerst das zweite Form angezeigt und alle nötigen Messages und Events verarbeitet. Erst dann kehrt Show zurück zu der nächsten Zeile und führt zwischenresultat... aus. Da das so schnell geht bekommst du davon aber nicht viel mit.
Aber du kannst dem Form3 ja mal ein OnShow-Event mit einer sinnvollen Zuweisung spendieren und dort einen Breakpoint setzen. Plötzlich wirst du mit dem Debugger merken das er in Form3 springt und den Show-Event abarbeitet. Erst wenn das erledigt ist wird mit zwischenresultat weitergemacht.bis bald
akari
-
Was so nicht explizit erwähnt wurde: Die Timer-Funktion wird deswegen weiter ausgeführt, weil Timer Nachrichtengesteuert funktionieren. Deshalb wird die Timerfunktion, trotz des ShowModal-Aufrufs, weiter abgearbeitet.
-
ShowModal(Form3) == repeat { Application->ProcessNonInputMessages(); } until Form3 closes
-

-

-
Na ja, was soll denn der Schwachsinn?!?
-
Kannst du mir sagen, warum du mich so angreifst? Ich wollte damit erklären, was ShowModal() bewirkt.
-
Da wär ich aber nie drauf gekommen, wenn Du es nicht noch dazu geschrieben hättest...
-
Lange Leitung...
