[ rsinisa @ 15.10.2002. 00:06 ] @
Pravim program koji komunicira sa spoljnim hardverom i ceka povratnu informaciju. Da ne bi cekao beskonacno u slucaju da nema odziva, hteo sam da upotrebim tajmer tako sto neposredno pre cekanja odziva postavim kontrolnu promenljivu na 0, ukljucim tajmer, i u tajmer rutini promenim vrednost promenljive. U petlji ispitujem ima li odziva, a takodje ispitujem i vrednost kontrolne promenljive, koja bi trebalo da se promeni ako je proteklo zadato vreme (konkretno 1000 ms) pre odziva. Medjutim, testovima sam ustanovio da se tajmer ponasa kao da nije ni ukljucen. Evo tog dela programa:

TimeOut = 0 ' kontrolna promenljiva
tmr1.Enabled = True ' tajmer je podesen na 1000 ms
Do Until Inp(regin) = 0 ' provera odziva
If TimeOut = 1 Then ' ako je promenljiva=1, izadji zi petlje
msg = MsgBox("Hardware timeout", vbOKOnly + vbCritical)
Out (regout), 0
tmr1.Enabled = False
Exit Sub
End If
Loop


A evo i tajmer rutine:

Private Sub tmr1_Timer()
TimeOut = 1 ' promeni vrednost kontrolne promenljive
End Sub


Kao sto rekoh, program se vrti u Do .. Loop petlji, ali se tajmer rutina uopste ne izvrsi. Kada tajmer aktiviram posebnim komadnim dugmetom, tajmer radi. Gde je greska?
A mozda postoji i bolje resenje za ovo sto mi je potrebno?

Pozdrav.
Sinisha

[ Krsta @ 15.10.2002. 00:40 ] @
Nisam siguran ali predpostavljam da je stvar u petlji.
Tu ti se program zadrzi i tajmer ne reaguje.
Probaj da napravis EXE i tad da pokrenes program.
[ Nemanja Dubravac @ 15.10.2002. 01:51 ] @
Ubaci Do Events u Loop petlju.... posto ne izvrsava nista drugo dok se ta petlja ne zavrsi valjda
[ jc denton @ 15.10.2002. 03:22 ] @
Citat:
rsinisa:
Pravim program koji komunicira sa spoljnim hardverom i ceka povratnu informaciju. Da ne bi cekao beskonacno u slucaju da nema odziva, hteo sam da upotrebim tajmer tako sto neposredno pre cekanja odziva postavim kontrolnu promenljivu na 0, ukljucim tajmer, i u tajmer rutini promenim vrednost promenljive.


E, ako vec radis bas to sto si opisao, onda ne preporucujem koriscenje Timer kontrole nego Timer funkciju preko koje mozes mnooogo preciznije da kontrolises takve procese.
Recimo :
vreme=timer
do
doevents
if (timer-vreme) > neki_interval then
neki_kod
exit do
endif
loop

pozdrav
[ rsinisa @ 15.10.2002. 22:38 ] @
Citat:
Krsta:
Probaj da napravis EXE i tad da pokrenes program.


Nije pomoglo.

Citat:
PcManiac:
Ubaci Do Events u Loop petlju


Da, to je ono pravo !

Citat:
jc denton:
E, ako vec radis bas to sto si opisao, onda ne preporucujem koriscenje Timer kontrole nego Timer funkciju preko koje mozes mnooogo preciznije da kontrolises takve procese.


Molio bih te da mi objasnis zasto je to mnogo preciznije, jer (koliko sam ja kao pocetnik shvatio) Timer funkcija ima rezoluciju od 1 s, a Timer kontrola 1 ms. A i prilikom koriscenja Timer funkcije moze da dodje do problema ako se petlja izvrsava na prelazu izmedju dva dana, jer ona vraca broj sekundi proteklih od ponoci. Znam da je verovatnoca mala za tako nesto, ali bih zeleo da izbegnem svaku mogucu komplikaciju.
Hvala svima na odgovorima, i ocekujte jos pitanja uskoro :).

Pozdrav.
Sinisha

[ jc denton @ 16.10.2002. 01:03 ] @
Ovo sto ti je Krsta naveo nije za dzabe receno, pogledaj temu :
http://www.elitesecurity.org/tema/7128

A to da Timer funkcija vraca sekunde je tacno, ali postoji i jedna sitnica - to ne mora da bude ceo broj. Vidi se da nisi ni pokusao da isprobas :)

Znaci, rezultat moze da bude i ovakav :
timer - vreme = .005
odnosno 5 ms.

Timer kontrola u nekim slucajevima jednostavno ne moze da postigne preciznost - timer event ne okida kada treba. Probaj i uverices se i sam. Jedino pravo resenje je Timer funkcija ili potrazi na netu recimo 'using multimedia timers in visual basic' ili sl.

pozdrav
[ Dragi Tata @ 16.10.2002. 03:10 ] @
Timer kontrola "ispod haube" koristi tzv User-mode timer koji se startuje API funkcijom SetTimer. Taj tajmer u pravilnim vremenskim intervalima postuje poruku WM_TIMER u message queue forme na kojoj je kontrola. E sad, kad će ta poruka biti primljena i obrađena je veliko pitanje, tim pre što je WM_TIMER poruka sa najnižim prioritetom. Zato su ovakvi tajmeri u principu nepogodni kada je potrebna velika preciznost. Dobra strana user-mode tajmera je ta da se sve izvršava u jednoj niti (thread-u) što itekako čini programerov život lakšim.

Koga interesuju tajmeri pod Windows-om, a razume se pomalo u API funkcije, može da pročita članak koji sam svojevremeno napisao za CodeProject.

http://www.codeproject.com/system/timers_intro.asp
[ jc denton @ 17.10.2002. 00:34 ] @
DT, tekst je veoma kvalitetan. Bavio sam se multimedia tajmerima, ali, posteno, nisam znao da ima ovoliko vrsta tajmera :)

Interesuje me gde bi mogao malo vise da procitam o user mode i kernel mode stvarima. O cemu se tu zapravo radi ?

pozdrav
[ Krsta @ 17.10.2002. 00:59 ] @
Ovde ima lepih stvari, jos samo da se isproba brzina...
[ Dragi Tata @ 17.10.2002. 03:34 ] @
Citat:
jc denton:

Interesuje me gde bi mogao malo vise da procitam o user mode i kernel mode stvarima. O cemu se tu zapravo radi ?

pozdrav


Pa, radi se zapravo o arhitekturi NT sistema. Programi rade ili u user modu (praktično sve aplikacije) ili u kernel modu (drajveri i drugi sistemski programi). User-mode kod ima daleko manje privilegija nego kernel-mode kod.

O tome možeš dosta da nađeš ovde:

http://www.winntmag.com/Articl...m?IssueID=26&ArticleID=301
[ rsinisa @ 17.10.2002. 21:05 ] @
Citat:
jc denton:
Ovo sto ti je Krsta naveo nije za dzabe receno


Nisam to ni mislio, jednostavno sam hteo da kazem da u ovom slucaju to ne funkcionise.

Citat:
jc denton:
A to da Timer funkcija vraca sekunde je tacno, ali postoji i jedna sitnica - to ne mora da bude ceo broj. Vidi se da nisi ni pokusao da isprobas :)


Nisam, necu da lazem :), jer jednostavno nemam vremena za neko studiozno proucavanje VB-a. A u helpu za Timer funkciju pise da vraca sekunde, ali sam prevideo prvi deo koji lepo kaze: "returns a single", pa je sasvim jasno da moze i delove sekunde.

Citat:
jc denton:
Timer kontrola u nekim slucajevima jednostavno ne moze da postigne preciznost


OK, ali u ovom slucaju mi nije potrebna preciznost, bitno mi je samo da imam nacin da izadjem iz petlje ako se hardver ne odazove neko vreme.
Hvala jos jednom svima, a za par dana ide novo pitanje :).

Pozdrav.
Sinisha