onclose / onlosequery problem (unsolved but done)
-
ich versteh die welt nimmer, ich drück das X in der ecke und das programm will net schliessen, kennt wer das phänomen ?
ich weis ich sollte quelltext dazu posten, aber das ist mir leider nicht erlaubt.
so hoffe ich das ihr mit der folgenden beschreibung was anfangen könnt.das programm besteht im groben aus 4 klassen
-applikation
-komponente mit
main-klasse
klasse die von thread erbt und übersetzungsroutninen beinhaltet (posix konforme zu VCL daten)
klasse die den socket steuert ( besitzt eine readsocket methode die von der execute der threadklasse permanent ausgefühjrt wird)
die main der komponente hat eine winproc methode mit der ich mittelst postmessage die daten aus dem socketthread auf den applicationthread synchronisiere. (ich weis das es da andere möglichkeiten gäbe !!! vielleicht liegt es auch daran)ich kann über den socket zum server eine verbindung mit einme weiteren rechner aufnehmen (tunnelung mittels eigens entwickelter befehlsstruktur).
wenn ich jetzt im onclose den befehl zum trennen der verbindung aufrufe kehrt dieser nach dem senden zurück aber das formular wird nicht geschlossen (cAction wurde auf cafree gesetzt)
baue ich jetzt eine 5sekunden sleep nach dem closebefehl ein schliesst sich das fenster, habe ich keine weitere verbindung aufgebaut schliesst sich das fenster auch...leiderleider keine quelltexte, aber ich bin echt verzweifelt... vielleicht hab ich ja was grundlegendes übersehen
mfg
-
Ich vermute es liegt an den Threads. Ich hab mit den VCL-Threads auch so meine Probleme gehabt. Die verhalten sich nicht, wie ich es erwarten würde, wenn man die Anwendung beendet. z.B. wird dann der Destruktor nicht mehr aufgerufen, respektive die Thread-Routine nicht sauber beendet. Sieht aus, als wäre es ein Timing Problem in der Terminate-Funktion des Threads. Der Thread hängt und scheint auf sich selbst zu warten und verbrät dabei alle verfügbare CPU-Zeit.
Ich habs damit gelöst, dass ich in den Threads WinAPI-Events verwende um dem Thread mitzuteilen, dass er beendet werden soll. Im MainForm einfach mit WaitForSingleObject() auf die Rückkehr warten, Thread::Terminate() aufrufen und ein Sleep(100) dahinter. Seitdem habe ich keine Probleme mehr mit den Threads.
__fastcall TFormMain::TFormMain(TComponent* Owner) : TForm(Owner) { Controller = new TControllerThread(true); // der Thread hEventGlobalTerminationRequest = Controller->GetGlobalTerminationRequestHandle(); // Event mit dem dem Thread mitgeteilt wird, das er sich beenden soll hControllerEventReadyForTermination = Controller->GetReadyForTerminationHandle(); // Event mit dem der Thread mitteilt, dass er bereit zum terminieren ist (nach durchlaufen des Clean-Up-Codes) while (Controller->Suspended) Controller->Resume(); } __fastcall TFormMain::~TFormMain() { SetEvent(hEventGlobalTerminationRequest); // Beendigung des Threads einleiten WaitForSingleObject(hControllerEventReadyForTermination, INFINITE); Controller->Terminate(); Sleep(100); Controller->WaitFor(); delete Controller; }Im Thread werden die beiden Events erzeugt und natürlich muß im Thread auch, mittels WaitForSingleObject(), geprüft werden, ob das Event ausgelöst wurde.
-
das ist nicht das problem, nach beendigung der formclose / closeformquery wird keiner der destruktoren (weder application noch irgendeiner) aufgerufen!! es scheint fast so als ob das signal zum beenden verloren geht O_o
-
Tja, ohne Code und ohne Kristallkugel...
-
ja leider, hab das problem vorerst umgangen, aber gelöst leider nciht, vielleicht kann ich es mit einfacherem code reproduzieren und dann zur diskussion stellen ^^ thx trotzdem für die idee