while schleife legt application lam
-
Hi,
ich hab ne while schleife in der ich nur Application->ProcessMessage() aufrufe, aber dennoch kann ich sonst nichts in der Anwendung bedienen.
Ohne ProcessMassage hängt die komplette Anwendung - logisch - Aber mit hängt sie zwar nicht aber nimmt keine signale von maus oder tastatur mehr an.

Hat jemand ne idee wodran das liegt bzw. was ich dagegen machen kann?
Danke
-
Wozu braucht man denn eine Schleife, in der nur ProcessMessages() aufgerufen wird? Ist irgendwie sinnlos?!?
Aber prinzipiell sollte das funktionieren. Zeig mal den Sourcecode.
Um allerdings zeitaufwändige Berechnungen durchzuführen und das Programm weiterhin verwenden zu können, verwendet man Threads.
-
Ich hab nen Achscontroller am rechner hängen, mit der while schleife warte ich auf ein signal.
[...] //Warte auf Signal while(!Form_IOInfo->LED_Achse3_Bit1->Checked) { //Schaltet motor der Achse ein if(Form_IOInfo->LED_ZAchse_Out_0->Checked==false) Form_IOInfo->LED_ZAchse_Out_0->Checked=true; // Abbruch bei zeitüberlauf if(ReferenzFehler) { T_FehlerReferenz->Enabled=false; LB_Error->Items->Add(Form_Main->Error->ReadString(Form_Main->Language+".Meldungen","032","032")); // Fehler beim Positionieren des Spiegels Logger(Form_Main->PfadErrorLog, Form_Main->Error->ReadString(Form_Main->Language+".Meldungen","032","032") ); SB_Ereignisse->Panels->Items[2]->Text=""; Form_IOInfo->LED_ZAchse_Out_0=false; Value_Programm->Value=0; return; } Application->ProcessMessages(); } [...]
-
Nun ja, dadurch, dass man in einem Form eine CheckBox (?) auf true oder false setzt, wird kein Motor ein- oder ausgeschaltet. Da muss also noch mehr passieren. Alle Formulare laufen im Kontext der Application-Instanz und irgendwo wird vermutlich Code aufgerufen, der länger zum Abarbeiten braucht, oder auf eine Rückmeldung wartet. Somit wird das ProcessMessages() vermutlich nicht, oder nicht oft genug aufgerufen.
Ich würde die Motorsteuerung wohl in einen eigenen Thread auslagern.
-
also die checkbox schickt nur ein signal üüber can bus raus, aber
selbst wenn ich alles was noch da drin steht auskommentiere, hab ich das problem.
Also quasi wenn nur:while(!Form_IOInfo->LED_Achse3_Bit1->Checked) { Application->ProcessMessages(); }da drin steht.
Ok, dadurch kommt die schleife nie zum ende, aber ich müsste doch sonst alles andere bedienen, oder?
-
Hallo
ProcessMessages eignet sich nur um Fortschrittsanzeigen zu aktualisieren und Abbrechen-Buttons abzufragen. Für eine dauerhafte parallele Ausführung ist es nicht geeignet. Dazu verwendet man Threads/Timer.
bis bald
akari
-
@akari: JB 'vergewalitgt' da das System zwar etwas, aber wenn tatsächlich nichts anderes ausgeführt wird, muss das funktionieren. Zumindest so lange die untergeordneten Forms nicht-modal sind.
Aber Du solltest unseren Rat befolgen und die Steuerung in einen Thread auslagern.
Ob das mit einem Timer funktioniert, kann ich nicht beurteilen. Aber da Timer auch nur über die Windowsbotschaften gesteuert werden, sehe ich da das gleiche Problem auftreten.