mikrocontroller.net

Forum: PC-Programmierung WxButton Event beenden!


Autor: Martin Forster (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: KingNothing (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Martin Forster (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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();}}}

Autor: Tobi H. (tobi-) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin Forster (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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++! :))

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Suche in Deinen Quelltexten nach einer von wxApp abgeleiteten Klasse.

Autor: Martin Forster (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Tobi H. (tobi-) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Martin Forster (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.