|
| Paus i tråd Fra : Harald |
Dato : 27-02-04 15:54 |
|
Hej
For at undgå 100% CPU forbrug vil jeg gerne holde en pause på 1 ms i min
tråd således at den kører ca. 1000 runder i sekundet. Sleep(1) virker fint
på nogle CPU´er men på andre holdes der ca. 15 ms pause så sleep kan ikke
bruges.
Jeg har lavet denne function som også virker fint, men hvis jeg bruger den
direkte i en tråd så kører CPU stadig på 100% så hvad gør man så?
procedure MySleep(antal : integer); //antal=milisek.
var
i,x,s : int64;
begin
QueryPerformanceFrequency(i);
i:=i div 1000; // dvs. count pr milisek.
QueryPerformanceCounter(s);
repeat
QueryPerformanceCounter(x);
until ((x-s)/i)>=antal;
end;
Mvh
HK
| |
Tom-Vidar Nilsen (27-02-2004)
| Kommentar Fra : Tom-Vidar Nilsen |
Dato : 27-02-04 16:08 |
|
> For at undgå 100% CPU forbrug vil jeg gerne holde en pause på 1 ms i min
> tråd således at den kører ca. 1000 runder i sekundet. Sleep(1) virker fint
> på nogle CPU´er men på andre holdes der ca. 15 ms pause så sleep kan ikke
> bruges.
Du kan ikke vente bedre. Windows er ikke beregnet på slik bruk.
Sleep kan ikke brukes stabilt med mindre en 20 milisekunder, og er systemet
hard belastet kan du se helt bort fra all nøyaktighet.
> Jeg har lavet denne function som også virker fint, men hvis jeg bruger den
> direkte i en tråd så kører CPU stadig på 100% så hvad gør man så?
>
> procedure MySleep(antal : integer); //antal=milisek.
> var
> i,x,s : int64;
> begin
> QueryPerformanceFrequency(i);
> i:=i div 1000; // dvs. count pr milisek.
> QueryPerformanceCounter(s);
> repeat
> QueryPerformanceCounter(x);
> until ((x-s)/i)>=antal;
> end;
Så lenge programmet ditt ikke slipper kontrollen tilbake til Windows vil det
kjøre med all den CPU tid det får.
Du kan legge inn Sleep(0) i loopen og teste hvordan det går.
Da forteller du Windows at du vil ha igjen kontrollen så fort som mulig, men
om ett annet program trenger tid så må du vente.
Pragrammet ditt blir uansett avbrutt av andre så sant prioriteten er real
time (farlig farlig).
| |
Harald (27-02-2004)
| Kommentar Fra : Harald |
Dato : 27-02-04 16:39 |
|
"Tom-Vidar Nilsen" <noone@kgb.ru> skrev i en meddelelse
news:C9J%b.6926$_c4.88791@news4.e.nsc.no...
> > For at undgå 100% CPU forbrug vil jeg gerne holde en pause på 1 ms i min
> > tråd således at den kører ca. 1000 runder i sekundet. Sleep(1) virker
fint
> > på nogle CPU´er men på andre holdes der ca. 15 ms pause så sleep kan
ikke
> > bruges.
>
> Du kan ikke vente bedre. Windows er ikke beregnet på slik bruk.
> Sleep kan ikke brukes stabilt med mindre en 20 milisekunder, og er
systemet
> hard belastet kan du se helt bort fra all nøyaktighet.
Det eneste program der skal køre på maskinen er mit program og på de CPU´er
hvor sleep(1) virker der kører tråden (TThread) ca. 1000 gange i sekundet,
så det er fint.
> > Jeg har lavet denne function som også virker fint, men hvis jeg bruger
den
> > direkte i en tråd så kører CPU stadig på 100% så hvad gør man så?
> >
> > procedure MySleep(antal : integer); //antal=milisek.
> > var
> > i,x,s : int64;
> > begin
> > QueryPerformanceFrequency(i);
> > i:=i div 1000; // dvs. count pr milisek.
> > QueryPerformanceCounter(s);
> > repeat
> > QueryPerformanceCounter(x);
> > until ((x-s)/i)>=antal;
> > end;
>
> Så lenge programmet ditt ikke slipper kontrollen tilbake til Windows vil
det
> kjøre med all den CPU tid det får.
>
> Du kan legge inn Sleep(0) i loopen og teste hvordan det går.
> Da forteller du Windows at du vil ha igjen kontrollen så fort som mulig,
men
> om ett annet program trenger tid så må du vente.
> Pragrammet ditt blir uansett avbrutt av andre så sant prioriteten er real
> time (farlig farlig).
Grunden til at jeg vil have tråden til at kører ca. 1000 gange i sekundet er
at den scanner nogle moduler der sidder på RS232 porten, de 1000 gange i
sekundet sikre at der scannes med maximal hastighed.
Mvh
HK
| |
Preben Mikael Bohn (27-02-2004)
| Kommentar Fra : Preben Mikael Bohn |
Dato : 27-02-04 17:21 |
|
Harald wrote:
> Grunden til at jeg vil have tråden til at kører ca. 1000 gange i sekundet er
> at den scanner nogle moduler der sidder på RS232 porten, de 1000 gange i
> sekundet sikre at der scannes med maximal hastighed.
Hvis det er over seriel porten, kan du vel blot få et event hver gang
der kommer data?
Med venlig hilsen Preben
| |
Preben Mikael Bohn (27-02-2004)
| Kommentar Fra : Preben Mikael Bohn |
Dato : 27-02-04 17:29 |
|
Preben Mikael Bohn wrote:
> Hvis det er over seriel porten, kan du vel blot få et event hver gang
> der kommer data?
Eller du skal måske sende noget til dem ~1000 gange i sekundet?
Jeg vil give Tom-Vidar ret; det er ikke umiddelbart muligt at lave
præcise scanninger under Windoze _generelt_. Men man kan jo altid være
heldig, og hvis man dræber så mange processer som muligt er man mere
heldig...
En bedre løsning er at sætte en lille (hardware) buffer/timer på
seriel-porten... Eller at skrive en device driver der kunne håndtere det...
Med venlig hilsen Preben
| |
Harald (27-02-2004)
| Kommentar Fra : Harald |
Dato : 27-02-04 23:10 |
|
"Preben Mikael Bohn" <nospam@nospam.com> skrev i en meddelelse
news:403f7041$0$175$edfadb0f@dread11.news.tele.dk...
> Preben Mikael Bohn wrote:
> > Hvis det er over seriel porten, kan du vel blot få et event hver gang
> > der kommer data?
>
> Eller du skal måske sende noget til dem ~1000 gange i sekundet?
Der bliver sendt forespørgelser til nogle moduler der sidder på RS232 >
RS485 porten, tråden venter så på svar (næsten) hver gang der er sendt en
forespørgelse. Hvis pausen i tråden bliver sat til mere end 1ms så opnår jeg
ikke den maximale scannings hastighed af modulerne.
Men jeg har fundet en løsning nu, ved at bruge en kombination af min MySleep
procedure og WaitForSingleObject funktionen.
Mvh
HK
| |
Preben Mikael Bohn (28-02-2004)
| Kommentar Fra : Preben Mikael Bohn |
Dato : 28-02-04 12:44 |
|
Harald wrote:
> forespørgelse. Hvis pausen i tråden bliver sat til mere end 1ms så opnår jeg
> ikke den maximale scannings hastighed af modulerne.
....
> Men jeg har fundet en løsning nu, ved at bruge en kombination af min MySleep
> procedure og WaitForSingleObject funktionen.
Uanset hvad du gør, kan du ikke regne med at Windoze kun vil behandle
din tråd eller at der ikke går ½ sekund eller mere mellem hvert kald...
Jeg sidder selv og laver en seriel rutine, og mine nuværende resultater
tyder på at man nogen gange kan have mere end 1 sek mellem to polls, men
for det meste en del under... Linux er faktisk ikke specielt bedre, men
granulariteten ser ud til at være lidt højere.
Med venlig hilsen Preben
| |
Harald (28-02-2004)
| Kommentar Fra : Harald |
Dato : 28-02-04 19:52 |
|
"Preben Mikael Bohn" <nospam@nospam.com> skrev i en meddelelse
news:40407e99$0$94993$edfadb0f@dread11.news.tele.dk...
> Harald wrote:
> > forespørgelse. Hvis pausen i tråden bliver sat til mere end 1ms så opnår
jeg
> > ikke den maximale scannings hastighed af modulerne.
> ...
> > Men jeg har fundet en løsning nu, ved at bruge en kombination af min
MySleep
> > procedure og WaitForSingleObject funktionen.
>
> Uanset hvad du gør, kan du ikke regne med at Windoze kun vil behandle
> din tråd eller at der ikke går ½ sekund eller mere mellem hvert kald...
Det eneste jeg ville opnå var at CPU´en ikke blev belastet 100% da
programmet skal kører 24/7.
> Jeg sidder selv og laver en seriel rutine, og mine nuværende resultater
> tyder på at man nogen gange kan have mere end 1 sek mellem to polls, men
> for det meste en del under... Linux er faktisk ikke specielt bedre, men
> granulariteten ser ud til at være lidt højere.
Med den hastighed jeg kører med nu på RS232(RS485) nettet nemlig 57600 kan
jeg polle ca. 250 moduler i sekundet, maskinen skal ikke kører andre
programmer, bortset fra alle standard processer som windows starter, så at
denne hastighed skulle falde til kun 1 i sek er nok ikke noget der vil ske
ret ofte. Og selv om det ville ske er det ikke noget problem i det så længe
der kun er ganske kort tid.
Mvh
HK
| |
Tom-Vidar Nilsen (29-02-2004)
| Kommentar Fra : Tom-Vidar Nilsen |
Dato : 29-02-04 02:29 |
|
> > > forespørgelse. Hvis pausen i tråden bliver sat til mere end 1ms så
opnår
> jeg
> > > ikke den maximale scannings hastighed af modulerne.
> > ...
> > > Men jeg har fundet en løsning nu, ved at bruge en kombination af min
> MySleep
> > > procedure og WaitForSingleObject funktionen.
> >
> > Uanset hvad du gør, kan du ikke regne med at Windoze kun vil behandle
> > din tråd eller at der ikke går ½ sekund eller mere mellem hvert kald...
>
> Det eneste jeg ville opnå var at CPU´en ikke blev belastet 100% da
> programmet skal kører 24/7.
>
> > Jeg sidder selv og laver en seriel rutine, og mine nuværende resultater
> > tyder på at man nogen gange kan have mere end 1 sek mellem to polls, men
> > for det meste en del under... Linux er faktisk ikke specielt bedre, men
> > granulariteten ser ud til at være lidt højere.
>
> Med den hastighed jeg kører med nu på RS232(RS485) nettet nemlig 57600 kan
> jeg polle ca. 250 moduler i sekundet, maskinen skal ikke kører andre
> programmer, bortset fra alle standard processer som windows starter, så at
> denne hastighed skulle falde til kun 1 i sek er nok ikke noget der vil ske
> ret ofte. Og selv om det ville ske er det ikke noget problem i det så
længe
> der kun er ganske kort tid.
Hvorfor skal du på død og liv kjøre i en loop. Windows er event driven,
bruk en timer.
Siden en vanlig system timer ikke er bra nok må du bruke en multimedia timer
og du kan også sette høyere prioritet på programmet ditt, men setter du real
time og gjøre en feil så er det bare å trykke reset, jeg har prøvd
Du finneren del info om dette om du søker med "delphi multimedia timer" på
google.
MVH TVN
| |
Harald (29-02-2004)
| Kommentar Fra : Harald |
Dato : 29-02-04 10:45 |
|
"Tom-Vidar Nilsen" <noone@kgb.ru> skrev i en meddelelse
news:Tgb0c.7272$_c4.90384@news4.e.nsc.no...
> > > > forespørgelse. Hvis pausen i tråden bliver sat til mere end 1ms så
<klip>
> > Med den hastighed jeg kører med nu på RS232(RS485) nettet nemlig 57600
kan
> > jeg polle ca. 250 moduler i sekundet, maskinen skal ikke kører andre
> > programmer, bortset fra alle standard processer som windows starter, så
at
> > denne hastighed skulle falde til kun 1 i sek er nok ikke noget der vil
ske
> > ret ofte. Og selv om det ville ske er det ikke noget problem i det så
> længe
> > der kun er ganske kort tid.
>
> Hvorfor skal du på død og liv kjøre i en loop. Windows er event driven,
> bruk en timer.
> Siden en vanlig system timer ikke er bra nok må du bruke en multimedia
timer
> og du kan også sette høyere prioritet på programmet ditt, men setter du
real
> time og gjøre en feil så er det bare å trykke reset, jeg har prøvd
>
> Du finneren del info om dette om du søker med "delphi multimedia timer" på
> google.
Jamen jeg bruger jo tråde (TThread), hvordan vil du bruge en multimedia
timer i en tråd?
/HK
| |
Tom-Vidar Nilsen (29-02-2004)
| Kommentar Fra : Tom-Vidar Nilsen |
Dato : 29-02-04 11:22 |
|
> > > Med den hastighed jeg kører med nu på RS232(RS485) nettet nemlig 57600
> kan
> > > jeg polle ca. 250 moduler i sekundet, maskinen skal ikke kører andre
> > > programmer, bortset fra alle standard processer som windows starter,
så
> at
> > > denne hastighed skulle falde til kun 1 i sek er nok ikke noget der vil
> ske
> > > ret ofte. Og selv om det ville ske er det ikke noget problem i det så
> > længe
> > > der kun er ganske kort tid.
> >
> > Hvorfor skal du på død og liv kjøre i en loop. Windows er event driven,
> > bruk en timer.
> > Siden en vanlig system timer ikke er bra nok må du bruke en multimedia
> timer
> > og du kan også sette høyere prioritet på programmet ditt, men setter du
> real
> > time og gjøre en feil så er det bare å trykke reset, jeg har prøvd
> >
> > Du finneren del info om dette om du søker med "delphi multimedia timer"
på
> > google.
>
> Jamen jeg bruger jo tråde (TThread), hvordan vil du bruge en multimedia
> timer i en tråd?
>
> /HK
WaitForSingleObject ...., jeg har ikke gjort det, men ett raskt søk viser at
mange andre har.
Prøv "thread timer delphi" delphi.
Prøv f.eks den første linken der og finn ett komponent som kan dette.
| |
Harald (29-02-2004)
| Kommentar Fra : Harald |
Dato : 29-02-04 11:32 |
|
"Tom-Vidar Nilsen" <noone@kgb.ru> skrev i en meddelelse
news:c4j0c.7291$_c4.92065@news4.e.nsc.no...
> > > > Med den hastighed jeg kører med nu på RS232(RS485) nettet nemlig
57600
> > kan
> > > > jeg polle ca. 250 moduler i sekundet, maskinen skal ikke kører andre
> > > > programmer, bortset fra alle standard processer som windows starter,
> så
> > at
> > > > denne hastighed skulle falde til kun 1 i sek er nok ikke noget der
vil
> > ske
> > > > ret ofte. Og selv om det ville ske er det ikke noget problem i det
så
> > > længe
> > > > der kun er ganske kort tid.
> > >
> > > Hvorfor skal du på død og liv kjøre i en loop. Windows er event
driven,
> > > bruk en timer.
> > > Siden en vanlig system timer ikke er bra nok må du bruke en multimedia
> > timer
> > > og du kan også sette høyere prioritet på programmet ditt, men setter
du
> > real
> > > time og gjøre en feil så er det bare å trykke reset, jeg har prøvd
> > >
> > > Du finneren del info om dette om du søker med "delphi multimedia
timer"
> på
> > > google.
> >
> > Jamen jeg bruger jo tråde (TThread), hvordan vil du bruge en multimedia
> > timer i en tråd?
> >
> > /HK
>
> WaitForSingleObject ...., jeg har ikke gjort det, men ett raskt søk viser
at
> mange andre har.
Som jeg skrev lidt tidligere så har jeg fundet en løsning der virker hvor
jeg også bruger WaitForSingleObject, jeg bruger dog ikke en timer men en
event object. Event objectet bliver sat når der kommer data ind på RS232
porten.
Mvh
HK
| |
Tom-Vidar Nilsen (27-02-2004)
| Kommentar Fra : Tom-Vidar Nilsen |
Dato : 27-02-04 17:32 |
|
> > > For at undgå 100% CPU forbrug vil jeg gerne holde en pause på 1 ms i
min
> > > tråd således at den kører ca. 1000 runder i sekundet. Sleep(1) virker
> fint
> > > på nogle CPU´er men på andre holdes der ca. 15 ms pause så sleep kan
> ikke
> > > bruges.
> >
> > Du kan ikke vente bedre. Windows er ikke beregnet på slik bruk.
> > Sleep kan ikke brukes stabilt med mindre en 20 milisekunder, og er
> systemet
> > hard belastet kan du se helt bort fra all nøyaktighet.
>
> Det eneste program der skal køre på maskinen er mit program og på de
CPU´er
> hvor sleep(1) virker der kører tråden (TThread) ca. 1000 gange i sekundet,
> så det er fint.
Hjelper ikke stort vist noe som helst trenger CPU, disk, mus osv.
Akkurat nå kjører 450 Treads og 43 processes her hos meg.
Du aner ikke hvor mange services og drivere som ligger og jobber i
bakgrunnen!
Disse trenger også tid.
> > > Jeg har lavet denne function som også virker fint, men hvis jeg bruger
> den
> > > direkte i en tråd så kører CPU stadig på 100% så hvad gør man så?
> > >
> > > procedure MySleep(antal : integer); //antal=milisek.
> > > var
> > > i,x,s : int64;
> > > begin
> > > QueryPerformanceFrequency(i);
> > > i:=i div 1000; // dvs. count pr milisek.
> > > QueryPerformanceCounter(s);
> > > repeat
> > > QueryPerformanceCounter(x);
> > > until ((x-s)/i)>=antal;
> > > end;
> >
> > Så lenge programmet ditt ikke slipper kontrollen tilbake til Windows vil
> det
> > kjøre med all den CPU tid det får.
> >
> > Du kan legge inn Sleep(0) i loopen og teste hvordan det går.
> > Da forteller du Windows at du vil ha igjen kontrollen så fort som mulig,
> men
> > om ett annet program trenger tid så må du vente.
> > Pragrammet ditt blir uansett avbrutt av andre så sant prioriteten er
real
> > time (farlig farlig).
>
> Grunden til at jeg vil have tråden til at kører ca. 1000 gange i sekundet
er
> at den scanner nogle moduler der sidder på RS232 porten, de 1000 gange i
> sekundet sikre at der scannes med maximal hastighed.
Windows er event driven og du kan ikke jobbe slik over tid.
Du kan prøve med en multimedia timer samt å sette høy prioritet på
programmet.
Da kan du muligens komme nærme idialet ditt.
Vanlig timere har ikke slik nøyaktighet.
Hvor bra du treffer kommer også ann på hvilken Windows version du kjører.
Søk på "delphi high definition timer component" med google.
| |
Henry (29-02-2004)
| Kommentar Fra : Henry |
Dato : 29-02-04 11:23 |
|
>
> For at undgå 100% CPU forbrug vil jeg gerne holde en pause på 1 ms i min
> tråd således at den kører ca. 1000 runder i sekundet. Sleep(1) virker fint
> på nogle CPU´er men på andre holdes der ca. 15 ms pause så sleep kan ikke
> bruges.
>
> Jeg har lavet denne function som også virker fint, men hvis jeg bruger den
> direkte i en tråd så kører CPU stadig på 100% så hvad gør man så?
>
> procedure MySleep(antal : integer); //antal=milisek.
> var
> i,x,s : int64;
> begin
> QueryPerformanceFrequency(i);
> i:=i div 1000; // dvs. count pr milisek.
> QueryPerformanceCounter(s);
> repeat
> QueryPerformanceCounter(x);
> until ((x-s)/i)>=antal;
> end;
Hej Harald
Kunne du ikke lige træde et skridt tilbage og forklare hvad det er du ønsker
at op nå og hvordan din kommunikations protokol ser ud?
Der findes et hav af rigtig gode kommunikationskomponenter der er event
styret. Hvis din kommunikationsprotokol er veldefineret så er der endda en
del komponenter der helt automatisk kan detektere pakker f.eks
STXDDDDDDDDDCRLF og meddele dig når sådan en pakke ankommer.
Er dine enheder ikke eventstyret så de selv sender når data ændres?
mvh
Henry
| |
Harald (29-02-2004)
| Kommentar Fra : Harald |
Dato : 29-02-04 17:55 |
|
"Henry" <henry@nomail.com> skrev i en meddelelse
news:4041bd75$0$1658$edfadb0f@dread14.news.tele.dk...
> >
> > For at undgå 100% CPU forbrug vil jeg gerne holde en pause på 1 ms i min
> > tråd således at den kører ca. 1000 runder i sekundet. Sleep(1) virker
fint
> > på nogle CPU´er men på andre holdes der ca. 15 ms pause så sleep kan
ikke
> > bruges.
> >
> > Jeg har lavet denne function som også virker fint, men hvis jeg bruger
den
> > direkte i en tråd så kører CPU stadig på 100% så hvad gør man så?
> >
> > procedure MySleep(antal : integer); //antal=milisek.
> > var
> > i,x,s : int64;
> > begin
> > QueryPerformanceFrequency(i);
> > i:=i div 1000; // dvs. count pr milisek.
> > QueryPerformanceCounter(s);
> > repeat
> > QueryPerformanceCounter(x);
> > until ((x-s)/i)>=antal;
> > end;
>
> Hej Harald
>
> Kunne du ikke lige træde et skridt tilbage og forklare hvad det er du
ønsker
> at op nå og hvordan din kommunikations protokol ser ud?
>
> Der findes et hav af rigtig gode kommunikationskomponenter der er event
> styret. Hvis din kommunikationsprotokol er veldefineret så er der endda en
> del komponenter der helt automatisk kan detektere pakker f.eks
> STXDDDDDDDDDCRLF og meddele dig når sådan en pakke ankommer.
> Er dine enheder ikke eventstyret så de selv sender når data ændres?
Mine enheder er ikke eventstyret, de sender ikke noget før de bliver bedt om
det.
Det eneste jeg ønskede var at der ikke blev brugt 100% CPU da programmet
skal kører 24/7 men som jeg har skrevet i en tidligere post i denne tråd så
har jeg fundet en løsning ved brug af WaitForSingleObject.
Mvh
HK
| |
|
|