[ Ivan Tanasic @ 17.10.2001. 21:43 ] @
Ima li neko predloga kako npr da izmerim kolko je vremena proslo od kad je korisnik 2 puta uneo npr. enter

znaci

enter
pa se broji vreme
enter
trajalo je xxx.xxx s
[ Ivan Dimkovic @ 19.10.2001. 08:31 ] @
Vidi f-je u time.h

ako koristis windows, jednostavno resenje je GetTickCount()
[ Ivan Tanasic @ 19.10.2001. 17:59 ] @
Citat:
Ivan Dimkovic je napisao:
Vidi f-je u time.h

ako koristis windows, jednostavno resenje je GetTickCount()


Gledao sam funkcije u time.h, al nisam nasao odgovarajucu. tj f-ja time je ok, vratice mi broj sekundi od 1 jan. 1970 00:00:00 i to se lako prebaci u zeljeno vreme, al frka je to sto mi treba nesto sto ce biti malo preciznije, npr 18.5 s, 5.78 s ......

ima nekih predloga?

p.s. trebalo bi da radi uglavnom pod dosom mada nemari ako radi i na ostalim sistemima (samo je pitanje zbog kartice koja se koristi)

[ Ivan Dimkovic @ 19.10.2001. 19:59 ] @
GetTickCount() bi ti radio posao u konzolnom NT modu. GetTickCount vraca broj milisekundi od startovanja windowsa. Napravis nit (thread) koja radi GetAsyncKeyState ili _getch sta vec zelis i izmedju pritisaka na odgovarajuce dugme belezis broj milisekundi - interval ti je razlika izmedju dve vrednosti.
[ Ivan Tanasic @ 19.10.2001. 21:23 ] @
Nebih rekao da ce to ici.. treba da radi pod dosom ili win 98. (znaci mora da radi pod dosom)
[ Ivan Dimkovic @ 19.10.2001. 22:07 ] @
Ako moze da se koristi Win98 onda moze - kompajliras ga kao konzolnu (text-mode) aplikaciju
[ Ivan Tanasic @ 19.10.2001. 23:04 ] @
Citat:
Ivan Dimkovic je napisao:
Ako moze da se koristi Win98 onda moze - kompajliras ga kao konzolnu (text-mode) aplikaciju


A sta ako ne moze??? ;)

dobro, ajd predpostavimo da moze.. aj malo pojasni kako to sve radi i jel to win API funkcija ili?
[ Ivan Dimkovic @ 20.10.2001. 07:43 ] @
Pa princip je prost:

1. U aplikaciji sa CreateThread() napravis nit koja ce samo svakih 100 ms [vidi: f-ja Sleep() ] sa GetAsyncKeyState() proveratati VK_ENTER - Izmedju svake uspesne provere se snima broj milisekundi sa GetTickCount() a razlika je u stvari tajming izmedju dva pritiska - onda tu vrednost mozes ili snimiti u neki fajl ili nesto deseto

2. Moras smisliti mehanizam za izlaz i aplikacije, recimo da se ceka na neki event u main()

[ Ivan Dimkovic @ 20.10.2001. 08:31 ] @
Ok, evo programcica - znaci ovo radi pod Win32 konzolom i sljaka sasvim lepo, mada ima neke mane (asinhrono citanje tastature, moze da se zagubi nesto u baferu ako krenes rafal po enteru)

E, sad - ovaj program koristi nekoliko Win32 API f-ja:

GetAsyncKeyState() - asinhrono citanje statusa nekog tastera
CreateThread() - kreira nit
GetTickCount() - cita broj milisekundi od startovanja OS-a

Da bi ovo proradilo kao Posix(R) (tj na svim OS-evima) moras ove API funkcije zameniti ekvivalentnim. Ja cu ti pomoci za jednu - CreateThread moze da se zameni sa _beginthread() koja je Posix i NT i Linux je imaju implementiranu (tj CRT library)

Inace, ne znam koliko si upucen u sistemsko programiranje, ali nit (thread) ti je deo programa koji se paralelno izvrsava sa ostatkom - znaci u ovom programu imas dve niti - glavnu (tj. main() ) i jos jednu koja samo skenira tastere. Obe niti rade u isto vreme - i da bi ovaj program bio malo pametniji moras uvesti i neku komunikaciju izmedju niti, ali to vec nije deo problema...

PS: da, ovo i ne mora da bude multithread aplikacija, sve iz ScanThread() mozes da stavis i u main() ali u tom slucaju program moze samo da skenira tastaturu i nista vise. Pretpostavljam da tvoj prog treba i nesto drugo da radi osim da ceka da neko pritiska enter :)

Code:

#include <windows.h>
#include <stdio.h>

void ScanThread()
{
  int last_enter_time = 0;

  do {
    if(GetAsyncKeyState(VK_RETURN)&0x8000) {
      /* enter je pritisnut */
      if(last_enter_time!=0) {
        float duration = (float)(GetTickCount() - last_enter_time);
        duration /= 1000.0f;   // konvertuj msec u sec
        printf("Interval izmedju 2 entera je bio: %f Sekundi!\n\n", duration);
      }
      last_enter_time = GetTickCount();
    }

    /* inace, ne radi nista - ili ispitaj neki uslov za izlaz odavde */

    // ...

    Sleep(50); /* obavezno, bez ovoga bi ti ova nit zauzela 100% CPU time */
  } while(1);
}

void main()
{
  HANDLE thd;
  DWORD   tid;

  /* kreiraj nit */
  thd = CreateThread(NULL,8192,(LPTHREAD_START_ROUTINE)ScanThread,(LPVOID)NULL,NULL,&tid);

  /* odavde tvoj program nastavlja da radi normalno, dok se u pozadini vrti scan */
  for(;;) {}  // i nikad ne zavrsava, ako ostavis ovo ;)

}


[Ovu poruku je menjao Ivan Dimkovic dana 20.10.2001 u 08:42 AM GMT]
[ glupi @ 20.10.2001. 09:27 ] @
Kolko sam shvatio ovako sa tom niti bi bilo moguce napraviti da mi program dok obavlja neku duznost stalno provjerava dali je neko unio neku posebnu kombinaciju tipaka, kao esc ili bilo koje slovo ali da se u isto vrijeme moze i da se ujedno main funkcija moze razvijat iraditi!
ps: mos dat link di ima malo vise o "niti"?

[Ovu poruku je menjao glupi dana 20.10.2001 u 09:31 AM GMT]
[ Ivan Tanasic @ 20.10.2001. 12:29 ] @
evo kako stvari stoje...

nije mi potrebno da korisnik radi nesto izmedju dva entera (zato sto tu nece biti 2 entera vec nesto drugo. tj. program treba da ceka neke podatje od jednog ad konvertora i da izmeri za koje vreme ce taj ad konvertor poslati prvu, pa potom drugu "seriju"), ali ne smeta ovako ;).


p.s. hvala ti mnogo
[ Ivan Dimkovic @ 20.10.2001. 12:54 ] @
Citat:
glupi je napisao:
Kolko sam shvatio ovako sa tom niti bi bilo moguce napraviti da mi program dok obavlja neku duznost stalno provjerava dali je neko unio neku posebnu kombinaciju tipaka, kao esc ili bilo koje slovo ali da se u isto vrijeme moze i da se ujedno main funkcija moze razvijat iraditi!
ps: mos dat link di ima malo vise o "niti"?

[Ovu poruku je menjao glupi dana 20.10.2001 u 09:31 AM GMT]


Pa to je i poenta niti (thread), naime - moderni operativni sistemi (Unix, NT, ...) imaju multitasking okruzenje koje se uvek implementira na nivou

- Procesa (vise procesa radi u isto vreme)
- Niti (svaki proces moze da ima vise niti, tj. delova procesa)

Zatim tu su semafori, eventi (dogadjaji), kriticne sekcije, koje sluze da se uskladi izvrsavanje takvog programa. To uopste nije tako jednostavno kada se radi sa slozenijim stvarima.

Predlazem ti da pogledas na google.com, trazi 'multithreaded programming guide' ili nesto slicno...

Najgrublje receno nit moze biti svaka funkcija - znaci mozes imati paralelnih funkcija koliko hoces. Prvi problemi ce doci kad svaka f-ja pristupa istim memorijskim lokacijama :)

Inace, u Windows NT SP5 pa na dalje postoje i tzv. 'Fibers' - ili lightweight niti koje zauzimaju minimalni procenat resursa i mogu da sluze za neke sistemske poslove kao ovaj gore (sken tastature, provera memorije) itd...


[Ovu poruku je menjao Ivan Dimkovic dana 20.10.2001 u 03:56 PM GMT]
[ glupi @ 27.10.2001. 02:16 ] @
Daj molim te ako imas ti ili bilo ko ode na disku neki txt o nitima ili multithreaded programiranju ako bi mi mogao bacit na mail jer sam sat vremena trazio to na netu i svugdje bi nasao odlicne knjige ali svugdje bi se pojavilo $. Sve kosta. Molim vas...
[email protected]