CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Modyfikacja podczas działania Sleep'a

Modyfikacja podczas działania Sleep'a

dział ogólny

Re: Modyfikacja podczas działania Sleep'a

Nowy postprzez nvdante » poniedziałek, 30 stycznia 2012, 00:42

Rozumiem. Zawsze myślałem, że te opóźnienia związane z wykonaniem kodu są mega krótki, a tu się okazuje, że niestety jednak dość sporo trwają, bo jeśli dziesięć obrotów pętli powoduje zmianę o około sekundę to już staje się zauważalne.
A czy w takim razie możliwe jest napisane programu typu metronom, który działa na normalnym Windowsie i nie ma takich opóźnień?

Pozdrawiam
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows 7Firefox

Re: Modyfikacja podczas działania Sleep'a

Nowy postprzez polymorphism » poniedziałek, 30 stycznia 2012, 11:43

Oczywiście, że jest taka możliwość. Najprościej będzie jak użyjesz timera TTimer. Metronom oparty o niego nie będzie zbyt dokładny, tzn. może pływać, ale na pewno będzie stabilniejszy niż koncepcja, którą zaprezentowałeś. Inna opcja to użyć timer multimedialny -> link. Jeszcze inna opcja, chyba najdokładniejsza, to użycie strumieni MIDI lub audio.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Modyfikacja podczas działania Sleep'a

Nowy postprzez nvdante » wtorek, 31 stycznia 2012, 01:01

OK, dziękuję za informację. Link już przeczytałem. Póki co nie wygląda skomplikowanie, więc być może uda mi się to wykorzystać.

Pozdrawiam
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows 7Firefox

Re: Modyfikacja podczas działania Sleep'a

Nowy postprzez Cyfrowy Baron » wtorek, 31 stycznia 2012, 06:00

Jeżeli szukasz multimedialnego timera, to mam tutaj taki kod:

Plik nagłówkowy np. Unit1.h
KOD cpp:     UKRYJ  
typedef struct tagANIMATEINFO
{
    HWND HForm;
    Graphics::TBitmap *Bitmap;
} ANIMATEINFO, *LPANIMATEINFO;

void CALLBACK TimerProc(unsigned int uID, unsigned int uMsg,
                              DWORD dwUser, DWORD dw1, DWORD dw2);

class TForm1 : public TForm
{
__published: // IDE-managed Components
    TButton *Button1;
    TImage *Image1;

    void __fastcall Button1Click(TObject *Sender);
    void __fastcall FormClose(TObject *Sender, TCloseAction &Action);

private: // User declarations
    int TimerID;
    LPANIMATEINFO lpani;

public: // User declarations
    __fastcall TForm1(TComponent* Owner);
    int __fastcall GetResolution(target);
    int __fastcall StartMMTimer(int Interval, int Resolution, DWORD data);
    void __fastcall KillMMTimer(int TimerID);
};


Plik źródłowy np. Unit1.cpp
KOD cpp:     UKRYJ  
#include <mmsystem.h>

__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
    TimerID = 0;
}

int __fastcall TForm1::GetResolution(int target)
{
    TIMECAPS tc;
    unsigned int uiTimerRes;

    timeGetDevCaps(&tc, sizeof(TIMECAPS));
    uiTimerRes = min(max((int)tc.wPeriodMin, target), (int)tc.wPeriodMax);
    timeBeginPeriod(uiTimerRes);
    return uiTimerRes;
}

int __fastcall TForm1::StartMMTimer(int Interval,
                                       int Resolution, DWORD data)
{
    return timeSetEvent(Interval, Resolution, TimerProc,
    data, TIME_PERIODIC);
}

void __fastcall TForm1::KillMMTimer(int FTimerID)
{
    timeKillEvent(FTimerID);
}

void CALLBACK TimerProc(unsigned int uID, unsigned int uMsg,
DWORD dwUser,
    DWORD dw1, DWORD dw2)
{
    LPANIMATEINFO lpani = (ANIMATEINFO *)dwUser;

    HDC Hdc = GetDC(lpani->HForm);

    static int pos = 0;
    pos = pos + 5;
    if (pos > 300) pos = 0;

    RECT R = Rect(pos - 5, 0, pos, lpani->Bitmap->Height);
    FillRect(Hdc, &R, GetStockObject(LTGRAY_BRUSH));

    ::BitBlt(Hdc, pos, 0, lpani->Bitmap->Width, lpani->Bitmap->Height,
             lpani->Bitmap->Canvas->Handle, 0, 0, SRCCOPY);

    ReleaseDC(lpani->HForm, Hdc);
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    lpani = new ANIMATEINFO;
    lpani->HForm = Handle;
    lpani->Bitmap = Image1->Picture->Bitmap;

    int Resolution = GetResolution(1);
    TimerID = StartMMTimer(10, Resolution, (DWORD)lpani);
}

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
    delete lpani;
    if (TimerID) KillMMTimer(TimerID);
}


Przedstawiony kod przeprowadza animację w Image1 w oparciu o multimedialny timer.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Poprzednia strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 35 gości

cron