Forum: PC-Programmierung WxButton Event beenden!


von Martin Forster (Gast)


Lesenswert?

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

von KingNothing (Gast)


Lesenswert?

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;
}

von Martin Forster (Gast)


Lesenswert?

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();}}}

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

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

von Martin Forster (Gast)


Lesenswert?

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++! :))

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Suche in Deinen Quelltexten nach einer von wxApp abgeleiteten Klasse.

von Martin Forster (Gast)


Lesenswert?

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?

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

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.

von Martin Forster (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.