Timer / Thread /
-
Hallo zusammen
Ich arbeite an einem Programm, bei welchem ich ein Timer verwenden muss.
und zwar kann der Benutzer minuten in Zahlenform eingeben.
Ich habe bereits ein Programm geschrieben, welches auf einem Lizenzserver nachschauen geht, welche Lizenzen gerade gebraucht werde....das funktioniert alles wunder prächtig...
nun möchte ich das Program erweitern, wie gesagt, soll nun eine Kontinuierliche Messung statt finden können. Das heisst der Benutzer gibt eine Minutenanzahl ein. Nun soll eben alle X Minuten eine Messung ausgelöst werden. In MFC gibt es ja keine Timer Objekt, das man einfach so programmieren kann....
Ich schlage mich zu zeit gerade mit der SetTimer(); rum...kommt das gut so oder muss ich nach etwas anderem suchen...?
Ich wäre sehr dankbar über einige Denkanstösse...!
Noch eine andere Frage:
Wenn ich den Timer hätte, müsste ich den in einem neuen Thread aufmachen, da sonst die Form blokiert ist?
Danke schon mal!
MFG
-
SetTimer() ist schon die richtige Funktion, um den Timer zu aktivieren. Dieser Funktion übergibst du eine ID (damit du den Timer wiederfindest), die Wartezeit in Millisekunden und eine Funktion, die nach Alauf dieser Zeit aufgerufen wird.
Jetzt kannst du entweder eine Funktion definieren, die du übergeben willst (in der MSDN steht auch drin, welche Parameter die bekommt) oder du gibst als letzten Parameter NULL und fängst die WM_TIMER-Nachricht ab.
PS: Wenn eine einzelne Messung relativ schnell geht, brauchst du keinen gesonderten Thread dafür. Die Timer-Funktion misst ihre Werte, gibt sie an den Dialog weiter und kehrt zurück zur Nachrichtenschleife.
-
Sorry wenn ich das Frage, aber ich weis nicht wie ich den 3.ten Parameter angeben muss...den für die Fuction die ich übergeben wil... ich möchte zum beispiel eine Methode aufrufen nach ablauf der Zeit?
Zudem Sagt mir der Compiler immer "function does not take 3 parameters"
Ich habe die MSDN dazu scho gelesen.
Könntest du mit bette sagen, wie es richtig heissen müsste. Müssen es 4 Parameter sein?#define TIMER_ID 1 long nIntervall=0; nIntervall = 10000 //10Sec SetTimer(TIMER_ID, nIntervall, /*Waskommt hier :-) */);Danke für die Antwort!
mfg
-
Entweder du definierst dir eine Funktion (static Member oder global), die du dort übergibst oder du verlässt dich auf die WM_TIMER-Verarbeitung:
//a: static void CALLBACK EXPORT OnMyTimer(HWND hWnd,UINT,UINT nEv,DWORD time); ... SetTimer(TIMER_ID,nIntervall,&CMyDialog::OnMyTimer); ... //b: void OnTimer(UINT nEv) { if(nEv==TIMER_ID) { //eigene Verarbeitung } else CWnd::OnTimer(nEv); } ... SetTimer(TIMER_ID,nIntervall,NULL); ...(die zweite Version ist vermutlich einfacher)
-
Danke für das Beispiel!
Ich bekomme jedoch immer die Meldung "function does not take 3 parameters"
wenn ich dan den 4ten dazutue (NULL) das mozt der Colpiler "cannot convert parameter 1 from 'const int' to 'struct HWND__ *'" das ist ja nur die ID?
Und muss ich zuerst den Timer setzen und dan die Funktion aufrufen?
Sorry für die vielleicht verwirrende Fragen
mfg
-
*nochmal nachsieht*
Es gibt zwei Funktionen namens SetTimer() - eine globale (die erwartet als ersten Parameter ein Handle zu deinem Fenster und dahinter ID,Zeit und Handler-Funktion) und eine Methode von CWnd (das ist die 3-Parameter-Funktion, von der ich bisher ausgegangen bin).
Wenn du dich außerhalb deines CWnd/CDialog/CView-Objekts befindest, mußt du die 4-Parameter-Version verwenden:SetTimer(AfxGetMainWnd()->m_hWnd,TIMER_ID,nIntervall,NULL);(PS: Diese Funktion SETZT deinen Timer, die CWnd-Methode OnTimer() reagiert darauf, daß der Timer ausgelöst wurde)
-
Ja danke stimmt

Ich konnte das Problem jez lösen!! Danke dir!!