Hallo Leute, könntet ihr mir bei einem Problem mit wxWidget weiterhelfen? Ich überlege u. probiere schon seit Tagen herum. Ich habe ein Programm mit wx-devcpp geschrieben, welches bei Button-Betätigung ein Event startet. Dieses springt in ein WxButton1Click-Unterprogramm, welches ein langes Ereignis startet (Leiterplattenprüfung). Jetzt will ich diese Funktion z.B. abbrechen, aber ohne gleich das ganze Programm zu schließen. Aber es will nicht. Ich habe es schon mit einigen sachen versucht. Das Programm hängt da richtig fest und führt stur die Funktion weiter aus. Weiss jemand einen sicheren Weg? Ich habe etwas von Threads gelesen, aber ob das das Problem löst weiss ich nicht. Außerdem soll das Event noch bei anderen Buttons die Hintergrundfarbe verändern. Macht es auch. ABER erst wenn die Funktion beendet ist. Warum ist das denn so? Weiss das jemand? Ich danke schonmal für hilfreiche Antworten. Bye Martin
Hm poste mal die funktion bei ders hängt. Threads könnten helfen, doch kannst du diese auch normalerweise nicht einfach abwürgen. Da es sehr lange dauert, denk ich mal das du in einer schleife etwas abarbeitest, mach einfach in der schleife etwas in dieser art: BOOL running=TRUE; void OnClick(){ .... for(i=0;....) { if(!running) break; ..... } } void OnCancel(){ running=FALSE; }
Hallo. Ja kann ich ein OnClick event im Event machen? Also so ist das Programm in der hauptdatei: void Pruef574B::WxButton1Click(wxCommandEvent& event){ verfahr_und_mess(x_0, y_0);} Dann springt er hierher und arbeitet das hier ab und springt dabei in weitere Unterfunktionen. Das dauert je nach leiterplatte bis zu 5min: void Pruef574B::verfahr_und_mess(long x0, long y0){ // Aufruf-Bsp.: verfahr_und_mess(); char x_string[5], y_string[5]; //int anfangswert_x; Zaehl_schaltung=0; //x0 = x_0; reset_bool(); adapter_auf(); for(h=0; h < zeilen; h++){ // Fahre 'zeilen' Zeilen in Y Richtung an x0=x_0; itoa(y0, y_string, 10); verfahr_in_y(y_string); y0+=y_fakt; for(k=0; k < spalten; k++){ // Fahre 'spalten' Spalten in X Richtung an itoa(x0, x_string, 10); verfahr_in_x(x_string); x0+=x_fakt; adapter_zu(); if(messen()){ gut_schlecht[Zaehl_schaltung]=1; WxEdit2->AppendText("\n------------------------------------------------- -------------------------------------------------\n"); WxEdit2->AppendText("SCHALTUNG GUT!\n"); WxEdit2->AppendText("--------------------------------------------------- -----------------------------------------------\n");} else{ WxEdit2->AppendText("\n************************************************* *************************************************\n"); WxEdit2->AppendText("SCHALTUNG DEFEKT!\n"); WxEdit2->AppendText("*************************************************** ***********************************************\n");} faerbe_buttons(Zaehl_schaltung); Zaehl_schaltung++; adapter_auf();}}}
Du blockierst mit deiner Funktion die Event Verarbeitung und damit auch das Reagieren auf Änderungen und Tastendrücke. Wenn du regelmässig in deiner langen Routine diese Sequenz aufrufst startest du manuell die Event-Bearbeitung: while (app.Pending()) Dispatch(); app mit deiner wxApp-Vererbung ersetzen
Hallo, ach vielen Dank. Werde das später gleich mal ausprobieren. Achso, wie komme ich auf die wxApp vererbung? Sorry, ich bin noch nicht lange bei c++! :))
Ja die Klasse mit der ich arbeite heisst z.b. Pruef574B. Und die Applikation heisst 574BApp. Kann ich das app in der Schleife durch folgendes ersetzen? Pruef574B Pruef574B(NULL); ...Pruef574B.Pending();..... ...oder muss ich die App direkt nehmen?
In deiner Header Datei muss irgendwo die Klasse Prüf... deklariert sein, im Kopf der Klasse sollte auch stehen, von welcher diese Abgeleitet ist. Bei einem wx-programm muss die Hauptklasse von wxApp abgeleitet sein... Stellvertretend geht auch while (wxTheApp->Pending()) wxTheApp->Dispatch(); Dadruch bekommst du einen Pointer auf dein Hauptobjekt.
Ja wxTheApp klappt. jetzt klappt alles. damit hat sich auch das button färben problem erledigt. denn jetzt arbeitet er diesen prozess auch ab. danke euch allen. super forum hier. und schnell gehts auch noch.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.