Zähler zählt hoch und doch wird nichts angezeigt.



  • Hallo.
    Irgendie habe ich da grad ein Problem mit meiner Uhr in dem Spielchen dass ich grad progge. Wie im anderen Thread schon beschrieben lass ich per GetTickCount die Zeit anzeigen die seit Prg.start vergangen ist. Ich zeige dass so an:

    fAktTime = (fTempTime-fPrgStartTime)+59;
    		sprintf (VarBuffer,"%.0f",fAktTime); 
    		TextOut (hdc,480,55,VarBuffer, strlen (VarBuffer)); // Anzeige der Minuten
    

    als nächstes möchte ich die Stunden Anzeigen und zwar so:

    sprintf (VarBuffer2, "%d  :",iFullHour);
    		TextOut (hdc,450,55,VarBuffer2, strlen (VarBuffer2)); // Anzeige der Stunden
    

    Die Stunden werden immer alle 60min erhöht.

    if (fAktTime>=59.9)
    		{
    			iFullHour+=1;
    
    		};
    

    Es wird bei Stunde nun aber immer nur 0 angezeigt, so wie das bei der definition gewünscht war. Mit dem Debugger hab ich mir den Wert von iFullHour angeschaut. Er schlägt pünktlich um auf 1. Aber wieso wird das nicht angezeigt ???



  • hab jetzt rausgefunden dass Die Stunde richtig angezeigt wird wenn ich in der if abfrage >59 statt >=59.9 schreibe (was ja sowieso falsch war da es ja nicht >= sondern nur > heissen sollte)
    Das verstehe ich aber nicht... Es heisst nämlich dass der Compiler bei Laufzeit genau zu dem angegebenen Zeitpunkt bei der Abfrage ankommen muss um dort hinein zu springen. Und Zwar gleich beim ersten Durchlauf. Ich habe doch aber WM_TIMER auf 1 sekunde gesetzt. Und WM_TIMER ruft dann jede Sekunde WM_PAINT auf. Das heisst, dass jede Sekunde auf diese Abfrage Gestoßen werden müsste. Und das ist aber offensichtlich nicht so....
    Verstehe ich da irgendwas falsch ?



  • Sorry, aber ich verstehe nur Bahnhof 🙄



  • *lol* sorry 🙂
    Also ich versuch anhängend alles nochmal etwas näher zu erklären.

    Ich ermittle über GetTickCount in WM_CREATE die Startzeit und hole in WM_PAINT wieder über WM_PAINT die derzeitige Zeit. Dies mache ich jede Sekunde, da ich einen Timer gesetzt habe der jede Sekunde über WM_TIMER InvalidateRect aufruft, dieses ruft ja dann jedesmal wieder WM_PANT auf. Deswegen also jede Sekunde.
    So, meine Minuten errechne ich durch die (derzeitige Zeit - die Startzeit/1000)/60. Diese Minuten werden in fAktTime gespeichert und ausgegeben (siehe Sourcecode). Bis dahin klappt das auch wunderbar. Die Zeitanzeige wird wie gewollt jede Sekunde aktualisiert.
    Ich will nun aber auch Stunden anzeigen. Dies wollte ich erreichen indem ich iFullHour um 1 erhöhe wenn die Minutenanzeige auf 60 umspringt (wie ne Uhr halt).
    Zu diesem Zweck habe ich meine if Abfrage in der ich abfrage ob die Minutenanzeige mehr als 59.9 anzeigt als praktisch 60 (Minuten). Wenn das geschieht soll iFullHour erhöht werden.
    Nun irgendwie klappt das aber nicht. Die Stunde bleibt immer auf 0.

    Folgendes fand ich per rumspielen und debugging heraus:
    Wenn ich in der Abfrage z.B. nicht >59.9 sondern >59 reinschreibe springt die Anzeige um.
    Dies lässt darauf schliessen, dass meine if abfrage nur einmal während der Laufzeit "benutzt" wird. Wenn zu diesem Zeitpunkt die Minutenanzeige nicht einen höheren Wert als 59.9 besitzt wird die Stundenanzeige nie erhöht. Wenn ich nun >59 da stehen hab, funktioniert es weil mein Startwert bereits bei 59 Minuten liegt und ich somit zum Zeitpunkt bei dem die If abfrage ausgeführt wird schon im bereich größer als 59 liege. (Ich habe zu debug zwecken einfach die Uhr schon automatisch auf 59 Min vorgestellt damit der Umsprung net jedesmal ne stunde dauert)
    Ich hoffe es ist diesmal verständlicher. Weiterhin hoffe ich auf Hilfe 😉



  • Also ich habe jetzt mal folgenden test gemacht:

    if (fAktTime)
    		{
    			iFullHour++;			
    			sprintf (VarBuffer,"%d",iFullHour);
    			TextOut (hdc,100,300,VarBuffer2, strlen (VarBuffer2));
    			return 0;
    
    		};
    

    Nun müsste ja ständig der Zähler aktualisiert ausgegeben werden. Er bleibt aber immer auf 1 stehen. Das muss heissen dass die Abfrage nur einmal durchlaufen wird. Wieso wird aber die Minutenanzeige immer aktualisiert ? Was stimmt denn nur nicht ?



  • Poste doch mal deinen kompletten Code, sonst müssen wir hier ständig weiter rätseln, was Du eigentlich machen willst...



  • Warum nimmst du nicht einfach 3 Timer (Sekunde, Minute, Stunde) oder nur den Sekunden-Timer und zählst dort eine oder mehrere Variable(n) hoch?



  • @flenders. Eigentlich ne sehr gute Idee einfach ne Variable mitzählen zu lassen. Hab ich auch probiert da es ja eindeutig unkomplizierter ist als meine Version mit der Abfrage. Doch ich stoße auf das selbe Problem. Beim Ausgeben der Stunde, wird nichts bis auf die initialisierte 0 angezeigt. Es wird glaube ich tatsächlich überhaupt nicht hochgezählt. Ich meine sonst müsste es ja klappen. Es ist sicher dass WM_TIMER jede Sekunde aufgerufen wird. Erkennbar an der aktualisierung der Minutenanzeige. Doch warum wird die Stunde nicht aktualisiert ?

    float			fTempTime, fAktTime;	// Temporäre Zeit + Aktuelle Spieldauer
    	int				iFullHour=0;			// Stundenanzeige 
    
    	switch (message)
    	{
    	case WM_CREATE:		
    		hdc=GetDC (hwnd);
    
    		GetTextMetrics (hdc,&tm);
    
    		fPrgStartTime = GetTickCount ();
    		fPrgStartTime= (fPrgStartTime/1000)/60;
    
    		SetTimer (hwnd,TIMER_SEC,1000,NULL);
    
    case WM_TIMER:
    		iCtrlVar2++;
    		if (iCtrlVar2==3600)
    		{
    			iFullHour++;
    			iCtrlVar2=0;
    		}
    		InvalidateRect (hwnd,NULL,FALSE);
    
    	case WM_PAINT:
    
    		hdc = BeginPaint (hwnd, &ps);
    
    		fTempTime = GetTickCount();
    		fTempTime= (fTempTime/1000)/60;
    
    // ** reale Spielzeit **
    		fAktTime = (fTempTime-fPrgStartTime)+59;
    		sprintf (VarBuffer,"%.2f",fAktTime); 
    		TextOut (hdc,480,55,VarBuffer, strlen (VarBuffer)); // Anzeige der Minuten
    		sprintf (VarBuffer2, "%d  :",iFullHour);
    		TextOut (hdc,450,55,VarBuffer2, strlen (VarBuffer2)); // Anzeige der Stunden
    

    Soo, das ist jetzt der gesamte relevante Code.

    Sicherlich habe ich nur irgendwas nicht beachtet, aber irgendwie hängts grad, sorry..



  • Ich denke es liegt daran, dass du das static vergessen hast 😉



  • ohhhhhhhh !
    Natürlich *ggg*
    Ich danke dir und entschuldige mich für die eigentlich unnötige Frage 😉


Anmelden zum Antworten