Funktion, die nicht endet wenn sie fertig abgearbeitet wurde ??
-
hört sich ein bischen komisch an, deswegen versuche ich es nochmal zu erklären:
man ruft eine funktion auf:
int iVar = DieFunktion();
jetzt ist meine frage:
ich möchte das diese funktion, wenn sie das ende erreicht, nicht ihren wert zurück gibt. stattdessen soll auf ein bestimmtes ereignis gewartet werden. beispielweise der benutzer drückt einen button. wenn der button gedrückt wird dann soll die funktion 'DieFunktion()' beendet werden und die variable im beispiel (oben) erhält den wert den diese funktion liefert.
ist soetwas realisierbar ?
mir kommt es manchmal so vor, als ob das auf diese oder ähnliche weise in manchen funktionen so gemacht wird (hab jetzt leider kein beispiel parat).
bin gespannt
-
klar, Du musst am Ende der Funktion halt ein Ereignis anfangen/testen. In einfachsten Fall eine globale Variable. Oder über Events, je nachdem
-
Vor allem solltest du Threads verwenden, um überhaupt die Eingabe von außen erkennen zu können - Thread 1 startet Thread 2 und ruft anschließend deine Funktion auf, Thread 2 überwacht was-auch-immer und setzt bei den richtigen Bedingungen eine globale Variable auf true, die Funktion selber wartet vor dem return in einer while-Schleife, bis diese Variable gesetzt wird.
-
I.d.R. macht man sowas in einem eigenen Thread und synchronisiert sich mit einem Event...
Thread:
DWORD WINAPI Thread(LPVOID pData) { HANDLE hEvent = (HANDLE) pData; DWORD ret = DieFunktion(); WaitForSingleObject(hEvent, INFINITE); return ret; }
Main-Window:
HANDLE hEvt; HANDLE hThread; void StarteFunktion() { hEvt = CreateEvent(NULL, FALSE, FALSE, NULL); DWORD dwThreadId; hThread = CreateThread(NULL, 0, Thread, (LPVOID) hEvt, 0, &dwThreadId); } int GetResult() { SetEvent(hEvt); WaitForSingleObject(hThread, INFINITE); DWORD dwRes; GetExitCodeThread(hThread, &dwRes); CloseHandle(hEvt); CloseHandle(hThread); return (int) dwRes; }
Das dies aber so jemand macht kann ich mir nicht vorstellen...
-
ne, das ist schon klar. aber ich möchte nicht das diese funktion sofort den wert zurück gibt wenn ich sie aufrufe. ich möchte warten bis das ereignis passiert und dann (nicht früher) soll die funktion beendet werden.
man könnte es ja so machen:
int CMeinDlg:DieFunktion() { while (bClicked == FALSE) Sleep(100); return (iDerWert); }
das ist natürlich s c h e i s s e gemacht wenn ich das mal so sagen darf
aberjetzt versteht man es wahrscheinlich besser.
wenn z.b. der benutzer geklickt hat wollte ich das so machen:
void CDMeinDlg::OnButClicked() { // Funktion beenden: end DieFunktion(); }
das end hab ich mir jetzt ausgedacht. aber an dieser stelle soll er zurück in die funktion springen und sie beenden.
-
ups da wart ihr schneller, aber ok ihr wisst was ich meine
danke ^^
-
Von außen kannst du einen Thread nur (mehr oder weniger elegant) abwürgen, aber dann darfst du keine Rückgabewerte erwarten. Wann es sicher ist, die Funktion zu verlassen, kannst du nur von innen festlegen.
Btw, wozu soll das Design eigentlich gut sein? Wenn ich ein Ergebnis habe, leite ich das weiter - du kannst das Ergebnis im Hauptprogramm immer noch zwischenspeichern und auf Wunsch des Nutzers ausgeben.
-
ich wollte das nur wissen weil es mir so vorkahm, das manche funktionen das so machen.
weiß leider nicht mehr welche
-
Also ich kann mir keine Funktion vorstellen, die so etwas machen würde. Bestenfalls einen vorzeitigen Abbruch bei langwierigen Berechnungen:
int long_func() { int temp_result; while(!abbruch) { //nächster Schritt in der Berechnung von temp_result; if(fertig) break; } return temp_result; }
("abbruch" wird von einer anderen Funktion gesetzt, wenn z.B. der User auf den "Rechnung unterbrechen"-Knopf gedrückt hat)
-
das währe in so einem fall dann wahrscheinlich die beste methode