Kezdőoldal » Számítástechnika » Programozás » Programban a másodperc ezred...

Programban a másodperc ezred részénél kisebb szünetet mivel lehet elérni? (akár másodperc milliomod részét vagy annál nagyobbat venni).

Figyelt kérdés

Megoldható ez, ha igen, mivel-hogyan? Technikailag érdekelne a dolog, hogy mitől függ.

Free Pascal-ban érdekelne nagyon, ha van rá megoldás.

Ha nem oldható meg ebben a programozási nyelvben, akkor érdekelnének más nyelvek, amelyben megoldható.

Arra gondolok, mint Pascal-ban a Delay eljárás, csak milliszekundumnál kisebb egységeket is tudjon.



2016. ápr. 6. 19:07
1 2
 11/14 SimkoL ***** válasza:

Ha gondolod itt van egy alap ami Delphi alatt működik. Küzdjél vele, hogy olyan időzítőd legyen amilyet te akarsz :)


uses windows;


procedure getCPUticks(var count: Int64);


var CPUclock : double; //CPU clock speed in MHz


implementation


procedure getCPUticks(var count: Int64);

//store 64 bits CPU clock in variable count

begin

asm

mov ECX,count;

RDTSC; //lower 32 bits --> EAX, upper 32 bits ---> EDX

//RDTSC = DB $0F,$31

mov [ECX],EAX;

add ECX,4;

mov [ECX],EDX;

end;

end;


procedure setCPUclock;

//set variable CPUclock

var t1,t2 : cardinal; //system clock ticks

cput1,cput2 : Int64; //CPU clock ticks

begin

t1 := getTickCount; //get milliseconds clock

while getTickCount = t1 do; //sync with start of 1 millisec interval

getCPUticks(cput1); //get CPU clock count

t1 := gettickcount;

repeat

getCPUticks(cput2); //get CPU clock count

t2 := gettickcount;

until t2-t1 >= 500;

CPUclock := (cput2-cput1)/((t2-t1)*1e3); //set CPU clock in microsecs

end;


initialization


setCPUclock;


end.

2016. ápr. 7. 09:43
Hasznos számodra ez a válasz?
 12/14 anonim ***** válasza:

C++ alatt, 376 nanoszekundum volt a legrövidebb idő amit kitudtam sajtolni belőle, így maradtam a mikroszekundumnál. Természetesen a processzor egy magját teljesen lefoglalja. 1 mikroszekundum 1,e-6 másodperc.


void MySleep(const long long us)

{

auto startTime = std::chrono::high_resolution_clock::now();

for (; std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::high_resolution_clock::now() - startTime).count() < us;) {}

}

2016. ápr. 7. 16:04
Hasznos számodra ez a válasz?
 13/14 A kérdező kommentje:

Nagyon köszönöm Mindenki válaszát.

Technikailag érdekelt a dolog.

Emlékszem a régi szép időkre, amikor egy 266 MHZ-es gépen még lassan, egy 500 MHZ-es gépen pedig villámgyorsan szólt a Pascal-ban megírt hangos program, mert az akkori CRT unit-ban lévő Delay eljárás CPU sebességtől függően futott.

Meglep, hogy most is csak közelítőlegesen (és nem pontosan) lehet mikroszekundumos időzítőt használni.

Régebben olvastam egy feladat kapcsán és csak felmerült bennem, miként is működhet ez a gyakorlatban.

2016. ápr. 8. 14:17
 14/14 anonim ***** válasza:

A fejlesztőnek nincs nagyon beleszólása az ütemező és a megszakítások működésébe egy Windows estében (feltételezem hogy Windows, mert nem írtál mást), ezért nem tudok elképzelni olyan feladatot aminél lehetne erre hagyatkozni a helyes működés biztosításához és lenne is értelme.


A Sleep, Delay és társai nagyon pontatlanok amik az ütemezőre és a megszakításokra hagyatkoznak, megspórolva értékes CPU ciklusokat. Már az is pontosabb ha egy while ciklusban addig kérd el az időt QueryPerformanceCounter hívással, amíg le nem telt a várakozni kívánt idő. Nem tartom kizártnak hogy az ezredmásodpercnél töredékénél is pontosabb így.


A probléma az, hogy az ütemező felbontása 1/64s, azaz 15.625ms. Ha a sleep vagy bármi más feladja a futást, az ütemező csak akkor tudja visszaadni legközelebb a CPU-t, amikor letelik a 15.625ms periódus.


Ha a feladat megköveteli az ilyen pontosságot akkor fontolóra kell venni a valósidejű operációs-rendszerek használatát. (VxWorks, QNX, eCos, RTLinux és társaik)


Nem valószínű, de lehet hogy ha el tudnád érni a HPET-et, akkor meg tudnád oldani ezt a problémát. Egy próbát azért megér:


[link]

2016. ápr. 9. 17:37
Hasznos számodra ez a válasz?
1 2

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!