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++ konsola WinApi(początki) wstrzymywanie aplikacji

Bruum 30 Wrz 2011 21:25 1392 4
  • #1 30 Wrz 2011 21:25
    Bruum
    Poziom 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?

    0 4
  • Pomocny post
    #2 01 Paź 2011 09:01
    Akane
    Poziom 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.

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0
  • #3 01 Paź 2011 10:10
    Bruum
    Poziom 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'

    0
  • Pomocny post
    #4 01 Paź 2011 12:16
    Akane
    Poziom 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.

    0
  • #5 01 Paź 2011 12:30
    Bruum
    Poziom 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

    0