Methode alle X Sekunden aufrufen
-
plizer, Fragensteller Nummer 1, hat wieder eine Frage.
Ich rufe eine Methode auf, die Daten aus der DB rausholt bearbeitet und wieder reinschreibt und anschließend ein Diagramm aus diesen Daten erstellt. Nun soll allerdings automatisch dieser Vorgang durchgeführt werden, so dass z.B: alle 5 Sekunden aktuelle Daten in die DB geschrieben werden und das Diagramm neu erstellt wird. Wie kann ich das realisieren? Komme ich da vielleicht um eine komplexe Threadprogrammierung drumrum? Die DB-Erstellung und Diagrammdarstellung dauert schon so 1-2 Sekunden.
-
Auf was für einem System arbeitest du? Auf WinAPI-Basis könntest du eventuell einen Timer setzen, der in regelmäßigen Abständen aktiviert wird. In reinem ANSI C++ bleibt nur eine Schleife:
time_t next_step=time()+5; while(!ende) { ... while(time()<=next_step); next_step=time()+5; }
-
Ich arbeite mit WinXP SP2, VC++ 6.0 und ATL/WTL (7.1) und habe aber auch Zugriff auf ein paar MFC-Koponenten (also die, die bei ATL/WTL beim Standard dabei sind).
Anfangs soll ein Button betätigt werden (so mache ich das im Moment) und danach könnte ich dann die Schleife starten, wie Du sie beschrieben hast. Gibt es dann eigentlich ein Problem, wenn der Benutzer andere Steuerelemente ändert, also ist noch genug Performance da?
-
Wenn du die Schleife direkt im Button-Handler startest, hast du ein Problem - solange die Schleife läuft, ist dein Fenster "tot". Aber in einer Windows-Anwendung würde ich sowieso eher SetTimer() nehmen.
-
Ich habe mir SetTimer() in der MSDN angeschaut. Verstehe allerdings die Parameter nicht:
SetTimer(hwnd, // handle to main window IDT_TIMER1, // timer identifier 10000, // 10-second interval (TIMERPROC) NULL); // no timer callback
hwnd -> Was muss ich übergeben? Mein MainDialog-Objekt?
IDT_TIMER1 -> muss ich sicherlich irgendwo definieren? Wie könnte das aussehen?
10000 -> Das ist klar.
(TIMERPROC) NULL -> Muss ich das beachten?
-
plizer schrieb:
Ich habe mir SetTimer() in der MSDN angeschaut. Verstehe allerdings die Parameter nicht:
da ist ne wunderschöne lange erklärung dazu drunter.
zu jedem parameter werden mehrere zeilen erklärung geschrieben.
Wenn man weiter schaut sieht man auch weiterführende informationen die dann bei ausführlichen Beispielen landen.
Wie war nochmal die Frage?
-
Dann bin ich wohl einfach zu blöd davor, kann man wohl nichts machen. Hab mir das, wie schon gesagt, durchgelesen.
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
plizer schrieb:
Dann bin ich wohl einfach zu blöd davor, kann man wohl nichts machen. Hab mir das, wie schon gesagt, durchgelesen.
du kannst gerne eine konkrete frage stellen. aber schau dir vorallem die code beispiele mal an.
-
Du bist glaube ich nicht blöd sondern nur faul. Ich glaube kaum, dass du dir die Erklärung wirklich durchgelesen hast, weil das kann man nur verstehen. Aber trotzdem für dich noch einmal:
SetWindowTimer () -> Funktion um einen Timer für das Programm zu starten
HWND -> Fensterhandle zum Hauptfenster (oder eben Hauptdialog)
int -> Timer-ID, über der der Timer unter WM_TIMER identifiziert wird
int -> Millisekunden-Intervall, in dem der Timer aufgerufen wirdDer letzte Parameter ist irrelevant, zumindest für deine Ansprüche.
Nachdem das geschehen ist, fängst du WM_TIMER ab, und behandelst du den Timer, der über die ID bezeichnet wird.
Vergiss aber nicht, den Timer über KillTimer () zu beenden, wenn du ihn nicht mehr brauchst.
KillTimer () -> Funktion um einen Timer zu beeenden
HWND -> Fensterhandle zum Fenster, dass den Timer besitzt
int -> Timer-ID, für den Timer, der beendet werden sollSo jetzt hast du es noch einmal durchgekaut und auf den Teller gespuckt bekommen.
Mfg Ominion
-
dat gibts auch noch: http://msdn2.microsoft.com/en-us/library/ms682492.aspx
aber erwarte nicht, dass ich dir die parameter erkläre, dazu bin ich zu faul
-
@Ominion: Danke für Deine Arbeit, das hat schon weitergeholfen.
Aber ist schon blöde wenn man mit was arbeiten muss was man hasst. Ich hätte mir nicht im Traum vorstellen können, dass es eine Programmiersprache gibt mit der man 10 Stunden an Dingen verschwenden, die normalerweise im Sekunden-/Minutenbereich zu lösen sind. Aber dank C++ mit ATL/WTL gibt es das!
Ich werde das Projekt abschließen und noch den Rest fertig machen und dann ist VC++ 6.0 mit ATL/WTL und der SchnickSchnack für immer gestorben. Das werd ich nicht mehr anrühren... Dann werde ich euch auch nicht mehr mit Fragen nerven, denn in Java habe ich in 5 Jahren noch NIEMALS ein Forum aufsuchen müssen.
Also vielen Dank an alle die geduldig meine Fragen beantwortet haben!
-
Ein Java Timer ist kaum anders. Der unterschied ist: dem WinAPI Timer gibst du entweder eine WndProc oder eine TimerProc an wo du ihn ausführen willst und dem Java Timer gibst du ein Runable Objekt.
Der einzige wirkliche unterschied ist, dass du in der WinAPI eine TimerID hast um den Timer nachher wieder killen zu können.
SetTimer(0, DBUpdate, 5000, DBUpdater);
Timer DBUpdate = new Timer(); DBUpdate->schedule(DBUpdater, 5000);
Also sorry, da sehe ich echt keinen relevanten unterschied.
DBUPdate in der WinAPI ist eine ID, in Java ein Objekt.
DBUpdater in der WinAPI ist eine TimerProc, in Java ein Runable.Ist fast 1:1 übersetzt.
Nichts für ungut, aber manchmal kann man sich auch absichtlich das Leben schwer machen in dem man sich einredet alles ist scheisse. Wenn du dich wenigstens über die echten Kritikpunkte der Winapi aufgeregt hättest... Aber Dokulesen musst du auch in Java.
-
Das war jetzt auch garnicht auf dem Timer bezogen, sondern eher das Ganze andere Zeug. Die Funktionsweise davon ergibt ja Sinn. Aber wenn man Stunden bis Tage braucht, um nen String aus einer ComboBox zu lesen oder ein Timestamp zu erzeugen, dann läuft da was falsch.
-
Seit Wochen Frage ich, wie man MFC in ATL nutzbar machen kann. Keiner hat es je geschafft mir zu helfen. Hier in der Firma kriegt es keiner hin und im Forum auch nicht. Und selbst mit CodeGuru gehts nicht, weil das alles nicht für so ein uralt-System gemacht ist wie mit dem ich hier arbeiten muss. Ich finds einfach nur erbärmlich...
-
Hm.
Die ATL hat doch eh fast alles was man braucht, wieso willst du da was mit der MFC machen?
Oder geht's um bestehenden MFC Code der jetzt im Rahmen eines ATL Projektes verwendet werden soll oder wie oder was?
-
Ich habe die MSDN zu SetTimer nochmal durchgeschaut. Leider weiss ich einfach nicht, wie ich an die ID für den Timer komme. In den Quelltexten wird immer einfach z.B. IDT_TIMER benutzt, allerdings muss ich doch erst an diese ID kommen bzw. erstellen?!
@hustbaer: Ach, das ist ne lange Geschichte...
-
plizer schrieb:
Ich habe die MSDN zu SetTimer nochmal durchgeschaut. Leider weiss ich einfach nicht, wie ich an die ID für den Timer komme. In den Quelltexten wird immer einfach z.B. IDT_TIMER benutzt, allerdings muss ich doch erst an diese ID kommen bzw. erstellen?!
Denk dir einfach eine schön aussehende Nummer aus und verwende sie dann (wichtig ist nur, daß jeder verwendete Timer seine eigene ID bekommt).
-
CStoll schrieb:
plizer schrieb:
Ich habe die MSDN zu SetTimer nochmal durchgeschaut. Leider weiss ich einfach nicht, wie ich an die ID für den Timer komme. In den Quelltexten wird immer einfach z.B. IDT_TIMER benutzt, allerdings muss ich doch erst an diese ID kommen bzw. erstellen?!
Denk dir einfach eine schön aussehende Nummer aus und verwende sie dann (wichtig ist nur, daß jeder verwendete Timer seine eigene ID bekommt).
Danke! Ich habe in der resource.h jetzt IDT_TIMER gestegelegt mit einer Nummer. Jetzt bekomm ich nur immer die Fehlermeldung
error C2660: 'SetTimer' : Funktion akzeptiert keine 4 Parameter
Ich habe folgendes versucht:
SetTimer(m_ParenthWnd, IDT_TIMER, 5000, 0); // So hab ich das öfter gesehen. SetTimer(m_ParenthWnd, IDT_TIMER, 5000, NULL); // Sollte das gleiche sein. SetTimer(m_ParenthWnd, IDT_TIMER, 5000, (TIMERPROC) NULL); // Hab ich aus der MSDN übernommen.
-
Arbeitest du mit der MFC? Wenn ja, verwendest du SetTimer() in einer Methode deiner Fensterklasse?
Wenn du beide Fragen mit ja beantworten kannst:
CWnd hat eine eigene Methode SetTimer(), bei der du den ersten Parameter weglassen kannst (die nimmt das eigene Window-Handle und übergibt es zusammen mit den übrigen Parametern an die globale SetTimer()). Damit hast du die Wahl zwischen:SetTimer(IDT_TIMER, 5000, 0);//definiert den Timer für das eigene Fenster m_Parent->SetTimer(IDT_TIMER, 5000, 0);//definiert den Timer für das Fenster m_Parent ::SetTimer(m_ParenthWnd, IDT_TIMER, 5000, 0);//Direktzugriff auf die globale Funktion
(btw, ob du da 0 oder '(TIMERPROC) NULL' angibst, ist letztlich egal)