Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Visual C++, jedan problem sa Timerom

[es] :: C/C++ programiranje :: Visual C++, jedan problem sa Timerom

[ Pregleda: 2571 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

braneiv

Član broj: 68650
Poruke: 52
..mtsns-ns.customer.sbb.co.yu.



Profil

icon Visual C++, jedan problem sa Timerom03.12.2005. u 01:25 - pre 223 meseci
Imam sledeci problem:

Radi se o jednostavnom programcicu zasnovanom na dijalogu.
Kod klase koja predstavlja dijalog, bitno je sledece:

Code:


class myDlg{
...
private:
     MojaKlasa * objekatMojeKlase;
public:
     void metoda1();
...
};



Metoda:

Code:

void MyDlg::metoda1()
{
      objekatMojeKlase->metodaMojeKlase();
}


Metoda moje klase:

Code:

void MojaKlasa::metodaMojeKlase()
{
      if (......)
            SetTimer( NULL , ID_TIMER, 500, NULL);
      ....

      if (....)
            KillTimer(NULL, ID_TIMER);

}



Ako sada pomocu Class Wizard-a dodam funkciju za obradu WM_TIMER
poruke ( MyDlg::OnTimer), ona mi nece hvatati WM_TIMER poruke
Timer-a koji sam naveo u kodu neposredno iznad. Kako to da popravim?
Tek sam poceo da radim u Visual C++, nije mi bas jasno sta da prosledim kao prvi
parametar metode SetTimer (tipa je HWND). Intuitivno, mislim da bi on trebalo
da bude povezan sa MyDlg, a posto sam ja prosledio NULL, nista se ne
desava. Moze li neko malo da mi pojasni?
 
Odgovor na temu

3MAJ86
Marko Radić
Business Development Manager, Beauty
Industry
München

Član broj: 46087
Poruke: 253
*.ppp-bg.sezampro.yu.

Sajt: marko-radic.blogspot.com


+137 Profil

icon Re: Visual C++, jedan problem sa Timerom03.12.2005. u 07:45 - pre 223 meseci
prvo preklopiš funkciju OnCreate() tvog dialoga, i unutar njega staviš funkciju SetTimer(...).

nakon toga bi trebalo bez problema da ti radi (bar je meni radilo).

evo primer moje OnCreate() funkcije koju sam radio ranije (kada sam pravio neki CD Player)


Code:

int CCDPlayerDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
    if (CDialog::OnCreate(lpCreateStruct) == -1)
        return -1;
    
    SetTimer(1, 1000, NULL);
    
    return 0;
}



nadam se da ti ovo pomaže...
when there is a why there is no how
 
Odgovor na temu

braneiv

Član broj: 68650
Poruke: 52
..mtsns-ns.customer.sbb.co.yu.



Profil

icon Re: Visual C++, jedan problem sa Timerom03.12.2005. u 11:36 - pre 223 meseci
Nema problema ako startujem Timer u bilo kojoj metodi dijaloga (MyDlg),
ali ja hocu da ga pokrenem u drugoj klasi, pokazivac na objekat te klase
je atribut klase MyDlg! U tom slucaju, metoda myDlg::OnTimer() ne hvata
WM_TIMER poruke tog Timera. Kojim "poduhvatom" obezbediti da ova metoda
ipak hvata i prekide Timera iz druge klase?


[Ovu poruku je menjao braneiv dana 03.12.2005. u 12:41 GMT+1]
 
Odgovor na temu

3MAJ86
Marko Radić
Business Development Manager, Beauty
Industry
München

Član broj: 46087
Poruke: 253
*.ppp-bg.sezampro.yu.

Sajt: marko-radic.blogspot.com


+137 Profil

icon Re: Visual C++, jedan problem sa Timerom03.12.2005. u 14:41 - pre 223 meseci
hm... problem zaista...

probaj da unutar tvoje klase za dialog deklarišeš message map koji će da ti kupi poruke timer-a tvoje (druge) klase gde ti je taj timer u stvari...

nisam siguran da će ovo da radi (nisam probao), ali možeš da pokušaš, ili da sačekaš da se javi neko iskusniji sa konkretnim rešenjem problema...
when there is a why there is no how
 
Odgovor na temu

yooyo

Član broj: 4891
Poruke: 1101
195.252.89.*



Profil

icon Re: Visual C++, jedan problem sa Timerom04.12.2005. u 00:48 - pre 223 meseci
Nije mi bas najjasnije sta zelis da uradis. Ako hoces da hvatas timer poruke u nekoj funkciji onda to uradi na sledeci nacin:

Code:
int timerID = SetTimer(NULL, 0, timeperiod, MyTimerProc);


Napisi MyTimerProc ovako:

Code:

VOID CALLBACK MyTimerProc(
  HWND hwnd,         // handle to window
  UINT uMsg,         // WM_TIMER message
  UINT_PTR idEvent,  // timer identifier
  DWORD dwTime       // current system time
)
{
 //tvoj timer code
}


Kad zavrsis sa timerom pozovi:

Code:
KillTimer(NULL, timerID);



Ako zelis da koristis timere tako da svaka instanca klase ima svoj timer onda to uradi ovako:

Code:

class MyClass
{
// konstruktori i destruktori...
public: 
  void RunTimer(int timeperiod)
  {
     timerID = SetTimer(NULL, (INT_PTR)this, timeperiod, MyTimerProc);
     // trik je da se prosledi this pointer kao parametar
  }

private:

  static VOID CALLBACK MyTimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent,   DWORD dwTime)
  {
   //tvoj timer code
   MyClass* c = (MyClass*)idEvent;
   c->OnTimer();
  }

  void OnTimer()
  {
   // timer code
  }
};


Nisam siguran da ce ovo da radi (pisem napamet). Probaj, pa ako radi super, a ako nece... smislicemo nesto sto ce daradi. Postoje mnogo bolji i precizniji timeri (tj. multimedia timers) pa mogu da okacim i code za rad sa njima.

yooyo
 
Odgovor na temu

braneiv

Član broj: 68650
Poruke: 52
..mtsns-ns.customer.sbb.co.yu.



Profil

icon Re: Visual C++, jedan problem sa Timerom05.12.2005. u 23:25 - pre 223 meseci
Hvala za odgovor, medjutim nisam siguran da sam bas dobro shvatio
ili mozda ti mene nisi shvatio. Svejedno, nasao sam vrlo jednostavno
rjesenje (mislim... sad je lako reci da je jednostavno).

Dakle, moja ideja je bila da tajmer pokrecem i zaustavljam u jednoj
klasi, a u drugoj da obradjujem njegove WM_TIMER poruke.
Ovo bi bile izmjene u primjeru koji sam naveo:

Code:

void MyDlg::metoda1()
{
      objekatMojeKlase->metodaMojeKlase(this->m_hWnd);
}


Code:

void MojaKlasa::metodaMojeKlase(HWND hwnd)
{
      if (......)
            SetTimer(hwnd, ID_TIMER, 500, NULL);
      ....

      if (....)
            KillTimer(hwnd, ID_TIMER);

}


... i sada su u MyDlg::OnTimer() "vidljive" poruke mog timera iz druge klase.
Sve ovo sam mogao ranije da otkrijem da su mi diskovi sa helpom ispravni :).

Sto se tice preciznijih tajmera, vrlo je moguce da ce mi biti potrebni pa cu se
javiti (ako vec ne nadjem da je neko o tome pisao).




[Ovu poruku je menjao braneiv dana 06.12.2005. u 00:44 GMT+1]
 
Odgovor na temu

yooyo

Član broj: 4891
Poruke: 1101
195.252.89.*



Profil

icon Re: Visual C++, jedan problem sa Timerom06.12.2005. u 10:36 - pre 223 meseci
WM_TIMER poruka i timer nije precizan. WM_TIMER poruka moze da bude odlozena zbog poruke veceg prioriteta i samam tim stvara se kasnjenje. Mozes ih koristiti za intervale od 500ms pa navise i u situacijama kada preciznost nije najbitnija. Za male intervale, jede dosta CPU vremena.


yooyo

[Ovu poruku je menjao yooyo dana 06.12.2005. u 11:39 GMT+1]
 
Odgovor na temu

braneiv

Član broj: 68650
Poruke: 52
..mtsns-ns.customer.sbb.co.yu.



Profil

icon Re: Visual C++, jedan problem sa Timerom09.12.2005. u 11:40 - pre 223 meseci
Preciznost mi jeste prilicno bitna, ali za sada mi timer sasvim ok radi,
a intervali su 60-70 ms. E sad, mozda ce mi u nekim situacijama (kada se
pojave prioritetnije poruke), timer izgubiti preciznost, sto nece biti dobro. Posto
kazes da ovaj timer "jede" dosta CPU vremena, mozda ce mi to biti problem ako
program budem koristio na slabijim masinama (a zelja mi je da ga prilagodim
upravo takvim). Ako ti nije problem, kada budes imao vremena, ukratko prezentuj
kako se koriste drugi timeri koje si pomenuo.
 
Odgovor na temu

dejandj

Član broj: 92
Poruke: 3620
*.rcub.bg.ac.yu.



Profil

icon Re: Visual C++, jedan problem sa Timerom09.12.2005. u 16:26 - pre 223 meseci
Citat:
braneiv: Preciznost mi jeste prilicno bitna, ali za sada mi timer sasvim ok radi,
a intervali su 60-70 ms. E sad, mozda ce mi u nekim situacijama (kada se
pojave prioritetnije poruke), timer izgubiti preciznost, sto nece biti dobro. Posto
kazes da ovaj timer "jede" dosta CPU vremena, mozda ce mi to biti problem ako
program budem koristio na slabijim masinama (a zelja mi je da ga prilagodim
upravo takvim). Ako ti nije problem, kada budes imao vremena, ukratko prezentuj
kako se koriste drugi timeri koje si pomenuo.


U tom slucaju koristi "cisti" C...
http://www.elitesecurity.org/tema/128934

 
Odgovor na temu

yooyo

Član broj: 4891
Poruke: 1101
195.252.89.*



Profil

icon Re: Visual C++, jedan problem sa Timerom11.12.2005. u 12:20 - pre 223 meseci
Onda koristi MM (multimedia) timere... Potrazi funkcije:

Code:

timeBeginPeriod
timeEndPeriod
timeGetDevCaps
timeGetSystemTime
timeGetTime
timeKillEvent
TimeProc
timeSetEvent


yooyo
 
Odgovor na temu

[es] :: C/C++ programiranje :: Visual C++, jedan problem sa Timerom

[ Pregleda: 2571 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.