Methode alle X Sekunden aufrufen
-
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)
-
Leider benutz ich die ATL/WTL. Ändert sich dadurch etwas wenn ich direkt mit der WinAPI arbeite?
-
Hey er compiliert mit ::SetTimer, statt nur SetTimer. Prima. Jetzt muss ich den Timer auch nurnoch richtig benutzen
Mal schauen...
-
Gesetzt ist der Timer ja, aber wie ich ihn anwende weiss ich niocht so recht. In der MSDN findet sich folgende Methode zur Anwendung des Timers und hab mal dazugeschrieben, was ich nicht verstehe.
LONG APIENTRY MainWndProc( // Warum ein großgeschriebenes LONG? HWND hwnd, // handle to main window UINT message, // type of message WPARAM wParam, // additional information LPARAM lParam) // additional information { HDC hdc; // handle to device context -> device context? Was genau ist gemeint? POINT pt; // current cursor location -> Welcher Cursor, welche Location? RECT rc; // location of minimized window -> Versteh nicht den Zusammenhang zwischen dem Timer und eines minimierten Fensters. switch (message) { // // Process other messages. // case WM_TIMER: (( ich denke hier drunter muss ich dann die Methode packen, die ich immer wieder ausgeführt haben soll? // If the window is minimized, compare the current // cursor position with the one from 10 seconds // earlier. If the cursor position has not changed, // move the cursor to the icon. if (IsIconic(hwnd)) // Keine Ahnung was das ist, sollte ich aber wohl einfach übernehmen { GetCursorPos(&pt); // Sind die folgenden Zeilen alle für mich nötig? if ((pt.x == ptOld.x) && (pt.y == ptOld.y)) { GetWindowRect(hwnd, &rc); SetCursorPos(rc.left, rc.top); } else { ptOld.x = pt.x; ptOld.y = pt.y; } } return 0; case WM_DESTROY: // Destroy the timer. KillTimer(hwnd, IDT_MOUSETRAP); PostQuitMessage(0); break; // // Process other messages. // }
-
Ich würde mal vermuten, daß der kompette Inhalt des 'case WM_TIMER:' Zweiges auf eine konkrete Anwendung zugeschnitten ist (wenn sich seit dem letzten Timer-Durchlauf die Cursor-Position nicht geändert hat, springe auf das Programm-Icon). Du mußt dort anstelle des
if(IsIconic(hwnd)){...}
die Arbeiten einfügen, die dein Programm in regelmäßigen Abständen erledigen soll.
-
Wenn du dir endlich mal die Referenz angeguckt hättest, und dann auch mal unter WM_TIMER nachgeschlagen hättest, würdest du gemerkt haben, dass die Timer-ID über WPARAM an WM_TIMER gesendet wird. D.h:
case WM_TIMER: switch (wParam) { case TIMER_ID: //ID des Timers (2. Parameter von SetTimer ()) //Hier kommen dann die Funktionen rein, die der Timer immer wieder ausführen soll break; } return 0;
Mfg Ominion
-
Danke euch beiden. Ich bin halt noch Anfänger in C++ und komme mit Nicht-Objekten (ok, primitive Datentypen gehen auch) einfach nicht klar. Woher weiss denn wParam von meinem TIMER, müsste ich ihm über die Parameter doch sicher mitteilen, aber dann weiss ich wiederum nicht, was ich übergeben sollte.
-
Der weiß davon, weil du es ihm mit SetTimer() mitgeteilt hast
(wenn der Timer auslöst, schickt er eine WM_TIMER Nachricht mit der angegebenen ID als wParam an das Zielfenster)
-
CStoll schrieb:
Der weiß davon, weil du es ihm mit SetTimer() mitgeteilt hast
(wenn der Timer auslöst, schickt er eine WM_TIMER Nachricht mit der angegebenen ID als wParam an das Zielfenster)
Achja
-
Ne, ich häng immer noch am WPARAM fest. Irgendwie ist es doch nirgends definiert? Also wo bekomme ich das her?
::SetTimer(m_ParenthWnd, IDT_TIMER, 5000, 0);
hat doch nix mit WPARAM zu tun oder?
-