Programmcode auf Aktion warten lassen
-
Hallo zusammen!
Da bin ich wieder......
Nachdem ich jetzt meinen Frust über den Abgabetermin verdaut habe, bin ich wieder am Basteln. Aber leider hänge ich immer noch am selben Problem fest:
Wie sage ich meinem C - Programmcode, dass er anhalten soll, bis ein Button geklickt wurde? Ich kriegs einfach nicht hin.
Ich habe jetzt schon mit Threads und Events herumprobiert (Dank an Fatal Error appears für den Hinweis). Und mein Code hält auch brav an und wartet.
.... -und wartet, -und wartet, -und wartet, .......
Leider ist nach wie vor mein Fenster blockiert und nicht ansprechbar. Daher kann ich dann mein geplantes Event "Klick auf Button" nicht durchführen.
Wie kann ich also entweder meinen Code stoppen und auf einen Klick warten oder aber mein Fenster während des Wartens ansprechbar machen? Ich kann einfach nicht glauben, dass es dafür keine Möglichkeit gibt......
Liebe Grüße, Luja.
-
Das Windows Progrgramm wartet schon selbständig. D.h es verbringt die Zeit damit entweder auf Messages zu warten oder Messages (Windows Messages) zu verarbeiten.
Das bedeuted, dass Du dein Code in der Fenster Prozedur plazieren kannst und dort auf die entsprechenden Messages reagieren (z.B. dass eben eine Button geklickt wurde).
Diese Beschreibung geht von einem "rohen" Winapi Fenster Programm aus, es gilt jedoch auch für WTL, MFC, etc. Dort gibt es jedoch Makros und andere Hilfsmittel um die Behandlung der Messages einfacher zu machen.
Simon
-
Hallo Simon,
irgendwie mag mein Code nicht auf eine Eingabe warten.
Das Problem ist: ich rufe aus meiner Mainfunktion eine andere Funktion auf. Und diese soll auf einen Klick warten.
Das ganze war zuvor ein Konsolen-Code in C. Die Passage, um die es geht, lautet in etwa folgendermaßen:
void FunktionAuswahl() { printf("\n\nSie haben nun folgende Auswahlmoeglichkeiten: \n <1> ... \n <2> ...\n<3> ...\n<4> ...\n"); scanf("%d", &auswahl); switch(auswahl) { case (1): ... break; case (2):... break; . . .} . . . }
Und da schaffe ich es einfach nicht, dass ich per Buttonklick die Variable "auswahl" fülle. Eigentlich soll der Code jetzt vor der switch-Anweisung darauf warten, was der Benutzer anklickt. Aber das kriege ich einfach nicht hin. Entweder hält der Code an und blockiert dafür aber das Fenster, oder aber er rauscht einfach über die Switch-Anweisung hinweg und macht logischerwiese gar nichts.
LG Luja
-
Das sieht nicht nach einem Windowsprogramm aus (printf), sondern nach einem Konsoloenprogramm.
-
Ja, das meine ich ja die ganze Zeit......
Ich möchte das Konsolenprogramm in ein Windowsprogramm "umwandeln" und ihm so eine grafische Oberfläche verpassen. Da aber einige Berechnungen ohne Benutzerinteraktion ausgeführt werden, habe ich die in andere Funktionen ausgelagert. Und nun fehlt mir die Möglichkeit, wieder "einzusteigen", wenn man so will. Und ich dachte mir, wenn ich doch von diesen Funktionen aus an das Fenster Messages senden kann, dann müsste das doch auch irgendwie "rückwärts" gehen, oder?
Und selbst wenn ich jetzt alles wieder in die Mainfunktion reinpacke, dann hält mein Programm vor der Switchanweisung doch immer noch nicht an, oder?
Ich hatte jetzt so etwas versucht wie
hEvent = CreateEvent(0, FALSE, FALSE, "hEvent");
2. vor der Switchanweisung:
WaitForSingleObject(hEvent, INFINITE);
3. beim Button:
if (lParam == (LPARAM)hButton) { if (HIWORD(wParam) == BN_CLICKED) { auswahl = 1; SetEvent(hEvent); } }
Aber der Button lässt sich nicht mehr anklicken.
LG Luja
-
Luja schrieb:
Ja, das meine ich ja die ganze Zeit......
WAS meinst Du die ganze Zeit? Du hast in dem anderen Thread geschrieben, Du hättest Dein Konsolenprogramm in ein Windowsprogramm umgeschrieben, nachdem Dir jemand einen Link zu einem WinAPI-Tutorial gepostet hatte.
In einem Windowsprogramm gibt es aber kein printf und kein scanf.
Wenn Du das noch in Deinem Programm hast, dann hast Du wahrscheinlich auch noch eine main-Funktion anstelle einer winmain-Funktion ...Falls ja, solltest Du Dich noch mal eingehend mit dem/einem Tutorial zur Windowsprogrammierung befassen.
-
Nein, ich habe es noch nicht umgewandelt, ich bin dabei es umzuwandeln. Wenni ch das schon geschafft hätte, wäre ich nicht so traurig gewesen, dass es nicht fertig geworden ist.
Und ich weiß, dass es in Winapi kein Scanf und Printf gibt! Genau da suche ich ja nach einer Entsprechung. Und ich habe auch keine main-funktion mehr!
Ich suche ja gerade nach einer Funktion, die ein scanf "ersetzen" würde. Eben einfach, dass das Programm auf eine Eingabe wartet.
Es muss doch irgend eine Funktion geben, die darauf wartet, dass man einen Button klickt..... Ich kann doch auch mittels "Sendmessage" mein Fenster ansprechen. Also muss ich doch auch irgendwie eine Message abfangen bzw abwarten können, bis jemand einen Button geklickt hat, ohne dass mein Fenster blockiert ist.Wenn ich jetzt dieses Konsolenspiel nie erwähnt hätte, was wäre denn die Antwort darauf, wie ich auf eine Aktion im Code warten kann? Es muss doch eine Unterscheidung und dann eine Verzweigung im Code möglich sein, ob der Benutzer jetzt Button 1, 2 oder 3 klickt. Oder muss ich jedesmal den Code redundant für jeden Button einfügen?
Oder manche Programme müssen doch mal auf irgendetwas warten (Schreiben einer Datei, Öffnen eines Programmes, usw....). Wie geht das denn da? Es muss doch eine "Warten-Funktion" geben, ohne dass gleich der Rest des Programmes blockiert ist und noch Eingaben möglich sind. Und genau so was suche ich.
Ich kann mir einfach nicht vorstellen, dass Windows einen dazu zwingt, den gesamten Programmcode in eine einzige Mainfunktion zu schreiben. Das würde allem widersprechen, was ich bisher über Programmierung gelernt habe von wegen Übersichtlichkeit, Redundanz und Mehrfachverwendung von Funktionen.
Ich hatte ja schon gedacht, dass "WaitForSingelObject" die Lösung wäre. Aber wozu dient diese Funktion, wenn ich das Event gar nicht auslösen kann?
-
Vielleicht solltest du erst einmal verstehen, wie eine Fensteranwendung im Unterschied zu einer Konsolenanwendung arbeitet. Das Stickwort heisst Messageloop, die ist der Hauptbestandteil der Fensteranwendung, wenn du das nicht verstanden hast brauchst du erst gar nicht weitermachen, weil es sinnlos ist. Hast du die Sache mit der Messageloop und dem Eventhandler verstanden, erklären sich deine Frage zur Impementierung deines Codes von selbst und du hast den Aha!-Effekt. Möglicherweise hilft es dir ja irgendwelche Codebeispiele zu studieren, wenn dir ein Buch zu aufwendig ist. Es gibt ja genug "Hello Word" Beispiele für Fensteranwendungen. Und deinen Code must du nicht groß umwandeln, das wirst du dann schon erkennen. Im Endeffeckt werden die Funktionen lediglich etwas anderster aufgerufen. In/Output unterscheiden sich natürlich, aber Rechenalgorithem und Speicherstrukturen, die du dir für die Konsole schon ausgedacht hast, sind identisch.
-
Nachtrag. scanf braucht du in der Fenstanwendung natürlich nicht. Du kannst dir einen Dialog mit Editfeld erstellen. Das Editfeld wird beim Drücken eines Buttons eingelesen und du kannst den eingelesenen String dann mit sscanf auswerten, genauso wie du es schon in der Konsolenanwendung realisiert hattest.