Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

C++ konsola WinApi(początki) wstrzymywanie aplikacji

Bruum 30 Sep 2011 21:25 1737 4
  • #1
    Bruum
    Level 23  
    Witam! Potrzebuję uruchomić aplikację konsolową w pętli, której odświeżanie ma się odbywać co ok. 20ms. Dokładniej wyglądać ma tak:
    Start-z timera?
    Wykonanie instrukcji-ok5 ms
    Aplikacja śpi.
    I tak cały czas. Trudność polega na tym, jak to zrobić w aplikacji konsolowej? W okienkowej bez większych kłopotów, okno sobie wisi do czasu komunikatu z timera. W konsoli coś podobnie jak w mikrokontrolerze, chyba. Może system(sleep);?
    Poza tym jak przekazać to timera info co ma pobudzić? Mam książkę Petzolda a tam opisany WM_Timer potrzebuje uchwytu okna a tu chyba go nie ma. Jak się za to ma zabrać początkujący?
  • Helpful post
    #2
    Akane
    Level 27  
    Skoro piszesz o WM_TIMER, to pewnie chodzi o funkcję SetTimer. Jej pierwszy argument może być zerem gdy nie masz okna, wtedy drugi argument jest ignorowany, a funkcja zwraca identyfikator utworzonego timera, który podajesz do funkcji KillTimer.

    Gdy już uruchomisz taki timer, będzie on wysyłał komunikat WM_TIMER tylko do kolejki komunikatów aktywnego wątku. Musisz wejść w standardową pętlę pompującą komunikaty - GetMessage + DispatchMessage by jakoś wyłapać aktywność timera.
    Teraz gdy do funkcji SetTimer podałeś adres funkcji, DispatchMessage załatwi sprawę i uruchomi Twoją funkcję. Natomiast jeżeli wstawiłeś zero, to zaraz po GetMessage musisz sprawdzić, czy MSG.message jest równe WM_TIMER, i wtedy coś tam zrobić "w timerze".

    Łatwiejsze i dokładniejsze będzie użycie timera multimedialnego. Funkcja timeSetEvent implementuje taki timer. W poniższym przykładzie użyłem eventu do synchronizacji działania programu. CreateEvent tworzy event, WaitForSingleObject "zawiesza się" czekając na sygnał gotowości, który wysyłasz z funkcji timera za pomocą SetEvent, w dowolnym czasie.
    Stała INFINITE oznacza tutaj że program ma działać dowolnie długo, a każda inna liczba określi czas w milisekundach.

    Code: cpp
    Log in, to see the code
  • #3
    Bruum
    Level 23  
    Witam i dziękuję!
    Gdzie mogę o w/w poczytać po polsku? Żeby już szczegółami głowy nie zawracać. Na próbę chciałem skompilować ale krzyczy o konwersję:
    1>c:\documents and settings\dell\moje dokumenty\visual studio 2008\projects\timer\timer\timer.cpp(25) : error C2664: 'timeSetEvent' : cannot convert parameter 3 from 'void *(__cdecl *)(UINT,UINT,DWORD,DWORD,DWORD)' to 'LPTIMECALLBACK'
  • Helpful post
    #4
    Akane
    Level 27  
    Wstaw __stdcall między "void" a "MyTimerProc" (dodałem do mojej poprzedniej odpowiedzi). Pewnie masz inaczej ustawione niż ja, dlatego nie kompiluje się.
    Informacje po polsku można znaleźć na google. Ja nie dysponuję żadną listą konkretnych stron, bo zazwyczaj nie ma po polsku tego, czego szukam; o ile czegoś szukam, bo zazwyczaj w lokalnym pliku pomocy prawie wszystko jest opisane, po angielsku.
  • #5
    Bruum
    Level 23  
    I o to chodziło! Dzięki!
    Żeby wpisać w google sensowne zapytanie to trzeba znać słowo kluczowe, które de facto jest przedmiotem zapytania i kółko się zamyka.
    pzdr kj