gibt es einen einfachen befehl in wxDevC++ zum aktualisieren der GUI. ist dies ohne thread möglich?
möchte während eines codes der hinter nem wxButton läuft eine wxListBox aktualisieren
besten dank!!
Hallo,
Wenn der Code „im“ Button an einem Stück so lange läuft, solltest Du GUI und Prozess trennen (verschiedene Threads).
Wenn der Code in einzelnen Happen läuft, kannst Du mit dem Button ein Startflag setzen, und z.B. per Timer immer wieder einen Happen anwerfen (weiterhin 1 Thread).
Evt. schreibe mal, welche Arten von Operationen Dein Code ausführt, eine halbe Stunde ist sehr, sehr lang.
Gruß
achim
Besten Dank schon mal, das mit den Threads hab ich auch schon gelesen.
Trotzdem danke!!
Ich entwickle eine Prüfeinrichtung für Funkanlagen, die einen Funkempfänger prüfen kann. Der Benutzer kann entweder einen Einzeltest durchführen (Dauert ca 1minute) und wird mit dem „Start“ Button ausgelöst, oder er kann einen Mehrfachtest durchführen.
Um den Mehrfachtest zu starten, muss der Benutzer die Anzahl Programmzyklen via WxEdit eingeben (z.B. 40). Somit rattert das Programm (auch nach bestätigen durch „Start“) 40Mal den ganzen Code durch.
Ach ja… welche Arten von Operationen?
Es handelt sich eigentlich darum, Outputs zu setzen, zu warten und dann die Inputs zu lesen und mit Vorgaben zu vergleichen.
Du brauchst KEINE Threads!
Hallo,
a) Versuche, ob Du aus Deinem Button-Kode Listoutput.aktualisiere(), oder Listoutput.Text = JetztNeuerText; (irgendwas in dieser richtung) sagen kannst. (Ist gebastelt, weis nicht ob das funktioniert)
b) versuche die 40 Aufrufe per Timer zu realisieren
* Timer besorgen, 100ms Weckzeit einstellen
* Schalterfunktion für 1x Testen bleibt
* Schalterfunktion für 40x Testen setzt nur einen Cnt=40
* Testfunktion setzt Flag isON = FALSE wenn fertig und aktualisiert Listoutput;
* TimerFunktion : wenn(Cnt > 0 && !isON) {TestStart(); Cnt–; isON = TRUE;}
Wenn wxDevC (das ich nicht kenne aber vermutlich) blockierend arbeitet, sollte version a nicht funktionieren. Version b sollte immer möglich sein
Alternativ gibt es ggf. einen Befehl zum Update der GUI. Diesen suchen und einsetzen.
Besten Dank!!
werdes morgen gleich mal versuchen!!
die gauge läuft bereits… hab einfach immer nach jedem programm happen ne formel die den aktuellen gauge wert +/- berechnet eingesetzt
mit wxGauge1->SetValue(berechneterWert); funktioniert das und aktualisiert sich sogar während dem programm, es sei den, das fenster wird inaktiv, dann wird alles weiss bis das programm durch ist
Hallo C8R2X !
Könnte es sein dass das Problem daran liegt das der Event-Dispatcher nie zum Zug kommt ?
Weil die Aufforderung zum Aktualisieren der GUI ist ja normalerweise auch nur eine Message die an die entsprechenden Fenster verschickt wird, wenn das Message-System mit dem Event-Dispatcher nie zum Zug kommt wird somit auch nie was aktualisiert.
mfg
Christof
Hi!
Mal allen danke für die Antworten…
Wie meinst du das mit dem Event Dispatcher… verstehs so ungefähr was du meinst, weiss aber nicht wie ich das prüfen kann .
musst wissen, ich bin das erste Mal mit Wx unterwegs und im Prinzip auch mit C++ (kenn nur C). Bin also schon froh hab ich n lauffähiges Programm zustande gebracht
mein event Button klick läuft einfach das ganze Programm durch, danach wird die GUI geupdated… ist leider aber dann etwas spät.
bin um jede einfach umzusetzende Hilfe dankbar.
Thread wär ne super Lösung, gibts ein schönes Beispiel?? Ich versteh nur dann wahrscheinlich nicht wo die einzelnen codestücke hinein zu kopieren sind…
Hallo C8R2X !
War auf Urlaub, daher erst jetzt eine Antwort:
Wie meinst du das mit dem Event Dispatcher… verstehs so
ungefähr was du meinst, weiss aber nicht wie ich das prüfen
kann .
Naja, da gibts nicht viel zu prüfen: wenn das Programm gerade eine Berechnung macht kommt der EventDispatcher einfach nicht dran, erst nach dem Beenden der Berechnungsroutine kehrt das Programm in die Message-Schleife zurück.
Die Message Schleife sieht etwa so aus:
while ( GetMessage(&msg, NULL, 0, 0) ) // message processing queue
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
Thread wär ne super Lösung, gibts ein schönes Beispiel?? Ich
versteh nur dann wahrscheinlich nicht wo die einzelnen
codestücke hinein zu kopieren sind…
Ich habe dazu auch kein Beispiel bei der Hand (programmiere nicht in wxDevC+), die zuständigen Funktionen sind jedenfalls ‚_beginthread()‘ und ‚_beginthreadex()‘.
Aber schau doch z.B. hier:
http://msdn.microsoft.com/en-us/library/kdzttdcb%28V…
mfg
Christof
Urlaub wär mir auch lieber
Danke für deine Hilfe! Heut krieg ich support von nem kollegen, mal sehn wie er’s macht. werds hier posten falls ich’s erklären kann
ok… die Lösung zum einmaligen aktualisieren der GUI ist:
wxYield();
da mein programm mit vielen sleep aufgebaut ist, hab ich in einer funktion immer nach 10ms Sleep ein Yield eingebaut. Funktioniert fast einwandfrei. einzig beim herumschieben des fensters wird das programm pausiert (nur während dem herumschieben, danach läufts weiter).
ne einfache lösung, auch wenns n bisschen bastelei ist.