Hallo,
ich habe klein Problemschen mit Zeitvergleich.
if(CTime Zeit1 == CTime Zeit2)
wird geprüft mit Aufruf je Sek.:
SetTimer(ID_CLOCK_TIMER, 1000, NULL);
jedoch falls eine Datei von Diskettenlaufwerk geladen wird,
gerade 1 Sek. bevor Zeit1 = Zeit2, if-Anweisung erkennt es nicht.
Ist doch klar, ID_CLOCK_TIMER wird kurz angehalten.
Gibt es irgendwelche bessere Lösung als nachträglich
Überlauf der Zeit zu prüfen?
für ID_CLOCK_TIMER habe ich Wert 1 eingesetzt.
welche Werte sind zulässig und welchen Auswirkungen haben?
Ausserdem die Zeit-Erkennung sollte die erste Priorität haben,
jedoch nicht andere Abläufe verlangsammen.
Hat jemand Idee?
danke,
Lech
Hallo Lech,
ich habe klein Problemschen mit Zeitvergleich.
if(CTime Zeit1 == CTime Zeit2)
wird geprüft mit Aufruf je Sek.:
SetTimer(ID_CLOCK_TIMER, 1000, NULL);
jedoch falls eine Datei von Diskettenlaufwerk geladen wird,
gerade 1 Sek. bevor Zeit1 = Zeit2, if-Anweisung erkennt es
nicht.
Ist doch klar, ID_CLOCK_TIMER wird kurz angehalten.
Gibt es irgendwelche bessere Lösung als nachträglich
Überlauf der Zeit zu prüfen?
für ID_CLOCK_TIMER habe ich Wert 1 eingesetzt.
welche Werte sind zulässig und welchen Auswirkungen haben?
Ausserdem die Zeit-Erkennung sollte die erste Priorität haben,
jedoch nicht andere Abläufe verlangsammen.
Hat jemand Idee?
Das primitivste ist den vergleich zu ändern:
if(CTime Zeit1 >= CTime Zeit2)
Dann wird zwar der Jitter grösser aber die Schlaufe kann sich nicht afhängen.
Die nächste Verbesserung ist die Callback-Funktion der Timer-Funktion zu verwenden. Die Funktioniert ähnlich wie ein Interrupt: Du übergibst dem Timer die Adresse einer Funktion, welche dann vom Timer bei jedem Timer-Ereignis aufgerufen wird.
MfG Peter(TOO)
natürlich stimmt, jedoch falls Alarmzeit hat noch Null Wert
ist immer kleiner als Lokal-Zeit. Deswegen meine Lösung:
CTimeSpan VbZeit = AlarmZeit - Zeit;
if((VbZeit.GetTotalSeconds() >= CTime Zeit2)
Dann wird zwar der Jitter grösser aber die Schlaufe kann sich
nicht afhängen.Die nächste Verbesserung ist die Callback-Funktion der
Timer-Funktion zu verwenden. Die Funktioniert ähnlich wie ein
Interrupt: Du übergibst dem Timer die Adresse einer Funktion,
welche dann vom Timer bei jedem Timer-Ereignis aufgerufen
wird.MfG Peter(TOO)
Hallo Lech
Falls könntest Du für die Callback-Funktion ein kleines
Beispiel geben, würde ich mich sehr freuen. Ist
proffesioneller.
Da meine Kristall-Kugel gerade in der Revision ist, solltest du noch einige Informationen rausrücken:
Betriebsystem ?
Compiler (Hersteller/Version) ?
Ist das Programm in C oder C++ geschrieben ?
Falls C++, welche Bibliothek wird verwendet (Keine, MFC, ATL, andere) ???
MfG Peter(TOO)
Hallo Peter, nett von Dir
Ich verwende Mickrosoft VisualC++ 6
meine Anwendung ist MFC Dialogbasierend
mit NULL Parameter
SetTimer(ID_CLOCK_TIMER, 998, NULL);
erreiche ich Erwignis WM_TIMER
und in die
Funktion OnTimer(UINT nIDEvent)
schreibe ich meine Quelcode.
Wie würde der letzte Parameter aussehen falls möchte ich
Einsprung in
meinefunktion(—)
erreichen.
SetTime(ID_CLOCK, 998, &meinefunktion(—)); ?
Habe ich richtig verstanden?
Außerdem habe ich ein Problem mit Installieren:
Mit Absicht habe ich zwei .Exe Programme geschrieben, die unabhängig arbeiten können.
Ein von denen nach Bedarf den Anderen mit Verwendung der Funktion WinExec aufrufen sollte.
Wie krige ich den Pfad hin, wenn der Benutzer bei installieren Standard-Pfad verändert.
Ist die einzige Möglichkeit eine Dll zu schreiben, die beide Programme verwenden?
hoffentlich nicht zu viel Fragen
danke,
Lech
Hallo Lech
mit NULL Parameter
SetTimer(ID_CLOCK_TIMER, 998, NULL);
erreiche ich Erwignis WM_TIMER
und in die
Funktion OnTimer(UINT nIDEvent)
schreibe ich meine Quelcode.
Hier liegt natürlich schon das erste Problem auf der Hand.
Wenn du Ereignisse wie WM-TIMER verwendest paasiert in Windows folgendes:
- Der Timer läuft ab.
- nun sendet der Timer eine WM_TIMER-Message an die Message-Queue deines Tasks.
- Wenn dein Task gerade nichts zu tun hat, schaut er mal nach ob etwas in seiner Queue rumliegt (die WM_TIMER-Message ist sicher nicht die einzige die da drin ist), dann entnimmt er die erste Message aus der Queue und ruft die entsprechende Funktion auf (möglicherweise ist das nur eine Dummy-Funktion), u.s.w.
Das Problem ist, dass zwischen dem eigentlichen Timer-Ereignis und der Bearbeitung durch dein Programm Zeit vergangen ist und du wirst nie genau wissen wieviel.
Du brauchst nur „SetTimer“ im Editor zu markieren und dann F1 drücken.
„MSDN Library Visual Studio 6a“ sagt dazu:
CWnd::SetTimer
UINT SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD) );
Return Value
The timer identifier of the new timer if the function is successful. An application passes this value to the KillTimer member function to kill the timer. Nonzero if successful; otherwise 0.
Parameters
nIDEvent
Specifies a nonzero timer identifier.
nElapse
Specifies the time-out value, in milliseconds.
lpfnTimer
Specifies the address of the application-supplied TimerProc callback function that processes the WM_TIMER messages. If this parameter is NULL, the WM_TIMER messages are placed in the application’s message queue and handled by the CWnd object.
Remarks
Installs a system timer. A time-out value is specified, and every time a time-out occurs, the system posts aWM_TIMER message to the installing application’s message queue or passes the message to an application-defined TimerProc callback function.
The lpfnTimer callback function need not be named TimerProc, but it must be defined as follows:
void CALLBACK EXPORT TimerProc(
HWND hWnd, // handle of CWnd that called SetTimer
UINT nMsg, // WM_TIMER
UINT nIDEvent // timer identification
DWORD dwTime // system time
);
Timers are a limited global resource; therefore it is important that an application check the value returned by the SetTimer member function to verify that a timer is actually available.
CWnd Overview | Class Members | Hierarchy Chart
See Also WM_TIMER, CWnd::KillTimer,::SetTimer
=================================================================
Außerdem habe ich ein Problem mit Installieren:
Mit Absicht habe ich zwei .Exe Programme geschrieben, die
unabhängig arbeiten können.
Ein von denen nach Bedarf den Anderen mit Verwendung der
Funktion WinExec aufrufen sollte.
Wie krige ich den Pfad hin, wenn der Benutzer bei installieren
Standard-Pfad verändert.
Ist die einzige Möglichkeit eine Dll zu schreiben, die beide
Programme verwenden?
Das Stichwort zu diesem Thema lautet: ActiveX-Server.
Ich haben einen, allerdings in VB6, geschrieben welcher bei direktem aufruf der EXE wie ein normales Programm, mit Fenster usw., funktioniert, wenn er aber als Server durch ein anderes Programm aufgerufen wird ist er für den Benutzer unsichtbar.
Ein ActiveX-Server wird normalerweise bei der Installation beim Windows registriert, somit muss das aufrufende Programm nur den Namen des des Servers, welcher nichts mit dem Dateinamen zu tun hat, kennen, den rest erledigt Windows. Das gleiche kann sogar so eingerichtet werden, dass der Server auf einem anderen Computer im Netzwerk automatisch gestartet wird. Das nennt sich dann DCOM oder DCOM+.
MfG Peter(TOO)
Hallo Peter,
zuerst danke.
Hier hast Du auf den Nagel getroffen:
„Das Problem ist, dass zwischen dem eigentlichen Timer-Ereignis und der Bearbeitung durch dein Programm Zeit vergangen ist und du wirst nie genau wissen wieviel.“
So weit wie ich weiss, glicklicherweise werden Zeitgeber-Nachrichten nicht gestapelt.
Ps.
Die Englische Aufklärung bringt mir leider gar nichts, also momentan muss ich aufgeben.
Die Hilfe habe ich auch, jedoch one "Sample"obwohl davon lerne ich am besten.
Deswegen meine blöde Fragen kommen.
Bis Jetzt, habe ich nur aus deutschen Büchern als Autodidakt gelernt.
AktiveX-Server klingt interessant, jedoch gibt es keine einfache Lösung?
Vor ein paar Tagen habe ich mir „Installschild für Microsoft VC++ 6“ angesehen.
Wenn man z.B. eine „Wav“ Datei in eigenem Programm verwendet oder eine andere Datei, dann Pfad ist erforderlich. Gibts eine Möglichkeit einen gültigen Pfad während der Installation sich in eine Datei laden, oder gibt es eine andere Technik?
MfG
Lech
Hallo,
???
bis jetzt sind wir zu keinen Ergebnissen gekommen.
Ich bin ein bischen enttäuscht und beeindruckt.
Mfg
Lech