Variable zeitabhängig überprüfen
-
hi ich hab ne kleine frage wie ich das realisieren kann:
sagen wir ich habe eine zahl 300 und sobald diese zahl 300 höher steigt und dies zb länger als 10 sekunden steigt wird ein befehl ausgeführt.
-
lekos schrieb:
hi ich hab ne kleine frage wie ich das realisieren kann:
sagen wir ich habe eine zahl 300 und sobald diese zahl 300 höher steigt und dies zb länger als 10 sekunden steigt wird ein befehl ausgeführt.
Ohne polling ist es nicht möglich, die Änderung einer Variablen mitzubekommen.
Besser du lässt die Variable nicht direkt ändern sondern kapselst den Zugriff über getter/setter. dann kannst du im setter jedesmal prüfen, ob die Zahl über 300 ist.
Dann noch eine Variable, die nen timestamp speichert. Im setter mit der aktuellen Zeit vergleichen, dann weißt du ob die >300 bereits >10sec behalten wurden.
-
l'abra d'or schrieb:
lekos schrieb:
hi ich hab ne kleine frage wie ich das realisieren kann:
sagen wir ich habe eine zahl 300 und sobald diese zahl 300 höher steigt und dies zb länger als 10 sekunden steigt wird ein befehl ausgeführt.
Ohne polling ist es nicht möglich, die Änderung einer Variablen mitzubekommen.
Besser du lässt die Variable nicht direkt ändern sondern kapselst den Zugriff über getter/setter. dann kannst du im setter jedesmal prüfen, ob die Zahl über 300 ist.
Dann noch eine Variable, die nen timestamp speichert. Im setter mit der aktuellen Zeit vergleichen, dann weißt du ob die >300 bereits >10sec behalten wurden.puh klingt etwas kompliziert ne einfachere möglichkeit gibts nicht?
-
Das ist schon einfach.
-
Kann mir vllt jemand einen kleinen anstoß mit nem code teil geben :)?
-
Du musst zwar keine Klasse nehmen, aber damit verhinderst du unkontrollierte Zugriffe.
class var { public: // hier Konstruktor(en) und andere notwendige Methoden void set(int value) { pruefe_bedingung(value); m_value = value; } private: void pruefe_bedingung(int value); int m_value; };
-
Hier eine Funktion, mit der du prüfen kannst, ob der Wert länger als 10 sekunden nicht mehr unter 300 liegt.
void Check(int Value) { static DWORD dwTime = (unsigned)time(NULL); if(Value<=300)dwTime = (unsigned)time(NULL); DWORD Difference = (unsigned)time(NULL)-dwTime; if(Difference>=10){/*Wert seit 10 sec nicht mehr unter 300*/} }Dieser Funktion müsstest du den Wert deiner Variablen übergeben. Die Funktion müsste dann z.B. Alle 0.5 Sekunden aufgerufen werden. Die Lösung mit den Set- und Get-Methoden ist zwar Performanter, allerdings könnte es dann passieren, dass ein Wert länger als 10 sekunden über 300 liegt. (Wenn der letzte Set-Aufruf, in dem der Wert der Variablen auf z.B. 310 gesetzt wurde, schon länger als 10 Sekunden zurückliegt und seitdem kein Set-Aufruf mehr erfolgte.)
MfG, Jochen
-
Jochen S. schrieb:
[...]
Da ist vielleicht noch anzumerken, dass dafür die WinAPI und der Header
<windows.h>benötigt werden.
-
Abstrakten Code kriegste:
class PrueferKlasse { private: int Number; time_t TimeStamp; public: PrueferKlasse(int number) : Number(number) { } //nicht unbedingt notwendig bool Pruefung() { if(Number > 300) { if(//deine TimeStamp Prüfung) { //dein Code... } } } void SetNumber(int number) { if(Pruefung()) { this->Number = number; } } };Sowas in der Art vielleicht
Edit:
Da war wohl wer schneller
-
danke euch vielmals

-
Nexus schrieb:
Jochen S. schrieb:
[...]
Da ist vielleicht noch anzumerken, dass dafür die WinAPI und der Header
<windows.h>benötigt werden.Nö, braucht man nicht.
-
Bruderherz schrieb:
Nö, braucht man nicht.
Dann solltest du verraten wie man auf DWORD kommt. Das gibt es weder in C noch in C++.
-
Unter 32 Bit einfach:
typedef int DWORD;
-
typedef unsigned long DWORD;
-
Und wo steht dieses typedef

-
FreakY<3Cpp schrieb:
Und wo steht dieses typedef

Gähn ...
-
Was besseres fällt einem wohl nicht ein, wenn man eingestehen muss, dass man Unrecht hat

-
Es ist doch sowieso absoluter Quatsch. time() gibt ein time_t zurück. Wie und wo das definiert ist ist wurscht, aber da steht sicher nicht "DWORD". Ich hab das Gefühl unter Windows kackt man auf die eigentlich definierten Typen und setzt überall ein "DWORD" hin, wo man meint da kommt irgendwas ganzzahliges zurück.
time_t stamp = time(NULL);Es gibt immer noch verschiedene Systeme, und wer da engstirnig einen eigenen typedef setzt bekommt irgendwann Probleme.
-
FreakY<3Cpp schrieb:
Was besseres fällt einem wohl nicht ein, wenn man eingestehen muss, dass man Unrecht hat

LOL! Das typedef kann sonstwo stehen, es muss nicht windows.h sein.
-
Steht das typedef irgendwo in dem Code? Nein. Ob man jetzt das typedef über die Funktion, oder den Windows Header oben drüber schreibt, ist quasi egal, nur das man mit dem Windows Header dann viel unnötiges geladen hat und man mit dem Code, der geschrieben wurde, eine Fehlermeldung bekommt. Aber Fakt ist, dass mein Vorposter mal wieder sehr Reif ist und man leider zu oft hier in dem Board auf Leute mit einem geringen Maß von Intelligenz stoßt.