Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C] Sprawdzanie czasu trwania wartości zmiennej

Dawid.wielun 16 Paź 2008 19:20 1605 16
  • #1 16 Paź 2008 19:20
    Dawid.wielun
    Poziom 20  

    Witam, da się jakoś sprawdzić czas trwania wartości zmiennej?
    Chodzi mi konkretnie o to że mamy jakąś zmienną powiedzmy
    a=100
    jeśli zmienna ta nie ulegnie zmianie przez 5 sekund wykonują się jakieś instrukcje.

    0 16
  • #2 16 Paź 2008 19:46
    skynet_2
    Poziom 26  

    trzeba by ją porównywać z np. b=100 i pobierać czas systemowy.
    jeżeli minie 5 sec[porównujesz ze zmienną pomocniczą czas początkowy] a zmienna się nie zmieniła to wywołujesz funkcję/goto/if.

    0
  • #4 16 Paź 2008 21:37
    Dawid.wielun
    Poziom 20  

    Kurczę no właśnie to nie takie proste... próbowałem tak ale to nie wychodzi przynajmniej z wykorzystaniem allegro.
    Program ma sprawdzić czy w ciągu 5 sekund została poruszona mysz (wciśnięty przycisk) jeden warunek no i drugi banalny czy getch() jest true i jeśli ani getch() nam nie zwraca true i jeśli ani to nad czym pracuje wykonuje się:

    Code:
    SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);

    tylko nie mogę tego opóźnienia 5 sekundowego zrobić wykorzystując allegro.
    Może macie jakieś pomysły?

    0
  • #5 16 Paź 2008 22:29
    skynet_2
    Poziom 26  

    Ja bym zrobił tak mniej więcej[pisane na szybko]

    Code:

    int mouse_move_check(void){
       int current_pos_x=0, current_pos_y=0, i=0;
       POINT point;
    while(zmienna globalna=0 przerywa sprawdzanie){
       GetCursorPos(&point);     
       if(current_pos_x == point.x && current_pos_y == point.y){i++;}else{i=0;}
       current_pos_x = point.x;
       current_pos_y = point.y;
       Sleep(100);//100ms
       if(i==50){i=1; return i;}//zwraca 1 jak nie było poruszenia przez 5 sec
    }
    i=0;
    return i;//zwraca 0 jeśli zmienna globalna przerwie while
    }

    0
  • #6 17 Paź 2008 17:28
    Dawid.wielun
    Poziom 20  

    Nie kompiluje się:
    `POINT' undeclared (first use this function)
    Co to za typ?
    Mam utworzyć go czy coś? Z jakich typów?

    Code:

    struct POINT
    {
    int x;
    int y;
    };

    ??

    `Sleep' undeclared (first use this function)
    Jaka biblioteczka?
    W tych nie ma:
    Code:
    #include <allegro.h>
    
    #include <stdio.h>
    #include <conio.h>
    #include <time.h>

    0
  • Pomocny post
    #7 17 Paź 2008 17:35
    skynet_2
    Poziom 26  

    w obydwu przypadkach

    Code:
    #include <windows.h>

    0
  • #8 19 Paź 2008 19:39
    Dawid.wielun
    Poziom 20  

    Dzięki działa super!
    Możesz jeszcze mi jeszcze napisać funkcję żeby sprawdzała czy nie został wciśnięty jakiś przycisk myszy, która też zwróci 1 po 5 sekundach bezczynności (nie wciśnięcia przycisku)? :)

    0
  • #9 19 Paź 2008 21:36
    skynet_2
    Poziom 26  

    jak tylko wymyśle sposób na przechwycenie przycisków myszy to OK, bo hooków globalnych jeszcze nie poznałem.

    0
  • #10 20 Paź 2008 22:18
    Dawid.wielun
    Poziom 20  

    Ma może ktoś jakiś pomysł na to... bo nie mogę wykombinować :/

    0
  • Pomocny post
    #11 20 Paź 2008 23:52
    skynet_2
    Poziom 26  

    Dawid.wielun

    tak na szybko napisane sprawdzanie przycisków lewego prawego i środkowego

    Code:
    int mouse_click_check(void){ 
    
       int i=0, bl=0, bl2=0, br=0, br2=0, bm=0, bm2=0;//left right middle
    while(zmienna globalna=0 przerywa sprawdzanie){
       bl2=bl;bl=::GetKeyState(VK_LBUTTON);//left
       br2=br;br=::GetKeyState(VK_RBUTTON);//right
       bm2=bm;bm=::GetKeyState(VK_MBUTTON);//middle
       if(
       (((bl2>>0)&0x1)==((bl>>0)&0x1)||((bl>>7)&0x1)==0)//left
       &&
       (((br2>>0)&0x1)==((br>>0)&0x1)||((br>>7)&0x1)==0)//right
       &&
       (((bm2>>0)&0x1)==((bm>>0)&0x1)||((bm>>7)&0x1)==0)//middle
       ){i++;}else{i=0;}
       
       Sleep(100);//100ms
       if(i==50){i=1; return i;}//zwraca 1 jak nie było kliknięcia przez 5 sec i przycisk nie jest wciśnięty
    }
    i=0;
    return i;//zwraca 0 jeśli zmienna globalna przerwie while
    }


    i multi funkcja 2 w 1 :D
    Code:
    int mouse_check(void){ 
    
       int current_pos_x=0, current_pos_y=0, i=0,
       bl=0, bl2=0, br=0, br2=0,bm=0, bm2=0;//left right middle;
       POINT point;
    while(zmienna globalna=0 przerywa sprawdzanie){
       bl2=bl;bl=::GetKeyState(VK_LBUTTON);//left
       br2=br;br=::GetKeyState(VK_RBUTTON);//right
       bm2=bm;bm=::GetKeyState(VK_MBUTTON);//middle
       GetCursorPos(&point);     
       if(//if rozbity bo jest troszeeeeczke za długi
       (current_pos_x == point.x && current_pos_y == point.y)//move
       &&
       (((bl2>>0)&0x1)==((bl>>0)&0x1)||((bl>>7)&0x1)==0)//left
       &&
       (((br2>>0)&0x1)==((br>>0)&0x1)||((br>>7)&0x1)==0)//right
       &&
       (((bm2>>0)&0x1)==((bm>>0)&0x1)||((bm>>7)&0x1)==0)//middle
       ){i++;}else{i=0;}
       current_pos_x = point.x;
       current_pos_y = point.y;
       Sleep(100);//100ms
       if(i==50){i=1; return i;}//zwraca 1 jak nie było poruszenia i kliknięcia przez 5 sec i żaden przycisk nie był/jest wciśnięty
    }
    i=0;
    return i;//zwraca 0 jeśli zmienna globalna przerwie while
    }


    edit: wkradł się mały błąd :D
    edit2: duży też się wkradł :D

    ztestowane ;)

    Pozdrawiam

    0
  • #12 21 Paź 2008 03:13
    Dr.Vee
    VIP Zasłużony dla elektroda

    A może tak poszukać w manualu allegro?

    Masz globalny handler mouse_callback, do którego możesz przypisać swoją procedurę reagującą na zmiany położenia/przycisków myszy.

    Masz install_int_ex do dodawania timerów użytkownika, możesz albo asynchronicznie sprawdzać pozycję myszki np. co 100ms, albo odczekać ile Ci potrzeba...

    Z tego co widzę to allegro ma słabe możliwości. Dużo więcej możliwości daje programowanie w modelu ze zdarzeniami (eventami), jak np. w bibliotece SDL (też prosta, niskopoziomowa, wieloplatformowa biblioteka do gier).

    Pozdrawiam,
    Dr.Vee

    0
  • #13 22 Paź 2008 18:32
    Dawid.wielun
    Poziom 20  

    Mógłbyś mi jeszcze tylko wytłumaczyć co znaczy to przypisanie:

    Code:
    bl=::GetKeyState(VK_LBUTTON);

    Co GetKeyState() robi wiem, ponieważ czytałem o tym jak chciałem jeszcze samemu to napisać, zanim założyłem temat ale to przypisanie nigdy nie widziałem "=::"
    oraz:
    Code:
    ((bl2>>0)&0x1)

    to to już w ogóle hehe, >> to przy wczytywaniu zmiennych (cin) a tutaj? Oraz to "&0x1" & to używałem przy wskaźnikach do odwoływania się do komórki pamięci a tutaj? I dlaczego jest 0x1? Skąd ta wartość?

    0
  • Pomocny post
    #14 22 Paź 2008 20:36
    Dr.Vee
    VIP Zasłużony dla elektroda

    W tym użyciu ::JakasNazwa oznacza, że chodzi o globalną (a nie lokalną) JakasNazwe (w tym przypadku funkcję, ale może być też użyte do zmiennych).

    a >> b to operacja binarnego przesunięcia a w prawo o b bitów (przesunięcie o 1 bit w prawo = podzielenie przez 2). W C++ ten operator został przeciążony dla czytania ze strumieni wejściowch (np. std::cin >> a).

    a & b to operacja iloczynu binarnego. Wartość wyrażenia (liczba & 0x1) to najmłodszy bit liczby, a wszystkie pozostałe są równe 0.

    Pozdrawiam,
    Dr.Vee

    0
  • Pomocny post
    #15 23 Paź 2008 04:06
    skynet_2
    Poziom 26  

    Dr.Vee napisał:
    W tym użyciu ::JakasNazwa oznacza, że chodzi o globalną (a nie lokalną) JakasNazwe (w tym przypadku funkcję, ale może być też użyte do zmiennych).
    Dr.Vee


    dzięki Dr.Vee sam nie byłem pewien co to jest, myślałem o przestrzeni nazw ale tam trzeba by się do niej odwołać np. std::cout, a teraz już wiem że chodzi o globalną funkcje/zmienną.

    Dodano po 3 [godziny] 43 [minuty]:

    pomyślałem że można by usprawnić
    więc funkcja sprawdzająca wszystkie klawisze
    cout'y możesz wywalić
    Code:
    int check(void)
    
    {
       //jeżeli był naciśnięty przycisk po uruchomieniu programu
       //ale przed wywołaniem GetAsyncKeyState to GetAsyncKeyState
       //zwróci jego wartość gdyż powiedzmy że sprawdza stan od
       //rozpoczęcia programu lub od jej ostatniego wywołania
       for(int i=0;i<256;i++){
          if(GetAsyncKeyState(i)){
             cout<<"czyszczenie"<<endl;}
       }
       int x=0;//zmienna pomocnicza
       while(1){//zmienna globalna == 0 przerywa, do testów dałem 1
       Sleep(5000);
       x=1;
       for(int i=0;i<256;i++){//sprawdzamy kody każdego klawisza
          if(GetAsyncKeyState(i)){
             cout<<"wciśnięty"<<" "<<i<<endl;x=0;}
       }//jak któryś przycisk zwróci 1 to zerujemy x
       if(x){return 1;}
       }
       return 0;
    }



    i funkcja multi

    Code:
    int check_all(void){ 
    
       int current_pos_x=0, current_pos_y=0, x=0;
       POINT point;
       for(int i=0;i<256;i++){
          if(GetAsyncKeyState(i)){//if jest potrzebny tylko do cout'a, żeby działało wystarczy tylko GetAsyncKeyState(i);
             cout<<"czyszczenie"<<endl;}
       }
    while(1){//zmienna globalna=0 przerywa sprawdzanie
       x++;
       GetCursorPos(&point);
       if(current_pos_x != point.x || current_pos_y != point.y){
          cout<<"poruszono myszką"<<endl;x=0;}
       current_pos_x = point.x;
       current_pos_y = point.y;
       for(int i=0;i<256;i++){
          if(GetAsyncKeyState(i)){//sprawdzamy kody każdego klawisza
             cout<<"wciśnięty"<<" "<<i<<endl;x=0;}
       }//jak któryś przycisk zwróci 1 to zerujemy x
       Sleep(100);//100ms
       if(x==50){return 1;}else{cout<<x<<endl;}//zwraca 1 jak nie było poruszenia przez 5 sec
    }
    return 0;//zwraca 0 jeśli zmienna globalna przerwie while
    }

    0
  • #16 23 Paź 2008 15:18
    Dawid.wielun
    Poziom 20  

    No to jeszcze tylko scroll i mamy wszystko ;)

    0
  • #17 24 Paź 2008 05:23
    skynet_2
    Poziom 26  

    Dawid.wielun
    scroll czyli WM_MOUSEWHEEL jest ultra trudny do zasymulowania, walczyłem z tym 2 tygodnie i poległem ale jego detekcja może być łatwiejsza.
    edit: udało mi się właśnie zasymulować scroll

    Code:
    mouse_event(MOUSEEVENTF_WHEEL,0,0,120,0);//lub -120 dla kręcenia w dół

    2 tygodnie męczenia a tu nagle olśnienie i działa [C] Sprawdzanie czasu trwania wartości zmiennej

    poszukałem również trochę o wejściu i z tego co widze to chyba jedyną możliwością jest pobieranie zdarzenia z okna albo hooki globalne, więc chyba będziesz musial zołożyć hooka globalnego na mysz.

    tu masz trochę info o hookach
    www.winapi.org
    msdn.microsoft.com

    jak będe miał chwile spróbuje to zmusić do działania.

    0