Precyzyjny licznik czasu

0

Piszę program rozwiązujący zagadki Sudoku. Jest to aplikacja DOS'owa tworzona na DEV

C++ 4.9.9.2. Ponieważ dla niektórych zestawów danych wejściowych program ma wykonać

dość sporo operacji chciałbym umieścić w nim wiadomość o przewidywanym czasie

zakończenia. Potrzebuję do tego dość dokładnego licznika czasu (najlepiej żeby

uwzględniał milionowe części sekundy). Czy ktoś mógłby mi doradzić jakich funkcji

bibliotecznych mogę w tym celu użyć, ewentualnie skąd pobrać kod takiego licznika ?</cpp>

0

Chodziło ci raczej o aplikacje konsolową, a nie DOS'ową :). Zainteresuj się tym api: QueryPerformanceCounter

0

Dosowa raczej nie.(16 bit)
Może konsolowa 32 bit win.

Funkcje win API do dokładnego odmierzania czasu

<mmsystem.h>

timeGetSystemTime
timeGetTime
timeSetEvent
itd.

0

w pascalu po przez mem[xxxx:xxxx] mozna sie dowołać do taktów zegara ale nie pamietam co postawić pod xxxx :) ale nie bede mowił czego nie pamietam tylko to ze
funkcja: 2ch
przerwanie 21h
zwraca w DL setne sekundy
jak nie miałeś nigdy z asmem do czynienia to moge tylko powiedzeć ze powinło to mniejwiecej eygladać tak

mov AX,2ch
int 21h
mov zmienna_zzadeklarowana_wczesniej,DL 
0

Jak zaczniesz używać przerwań w programie pod windows (we wstawkach) to ci się wysypie program,
lepiej korzystac z WinAPI lub jakichś bibliotek.

0

Próbowałem używać funkcji QueryPerformanceCounter(), ale jak dotąd wszystkie moje próby kończą się tym że funkcja zwraca wartość false i nici z mojego zegara :-[ . Mimo wszystko dzięki, sprawdzę dlaczego tak jest, albo spróbuję sposobu z asm. PZDR

0

Precyzyjny facet jesteś - podawać urzytkownikowi przewidywany czas
obliczeń z dokładnością do mikro sekundy! :-)

Nie zapomnij uwzględnić zasady nieoznaczoności Szwarcenberga - stała placka razy... no wiesz o co chodzi. :-D

0

Zapomnijcie o precyzyjnym odmierzaniu czasu pod Win32, jeden maleńki trojanek, robaczek i Win32 zaczyna przekłamywać zegar. Rozwiązaniem byłoby wykorzystanie któregoś timera na płycie głownej ale przecież nasz genialny m$ blokuje dostęp do hardware z poziomu asma. Win32 nie nadaje się do mierzenia czasu.

0
quantum idiot napisał(a)

Nie zapomnij uwzględnić zasady nieoznaczoności Szwarcenberga - stała placka razy... no wiesz o co chodzi. :-D
User wraz z kompem musiałby poruszać się z prędkością liczoną w km/s żeby takie uwzględniać :). Ale po kiego grzyba ci mikrosekundy w sudoku. Milisekundy powinny wytarczyć (timeSetEvent, timeGetTime, SetTimer, SetWaitableTimer, GetThreadTimes ...), nawet jeśli błąd zaokrąglenia się namnoży to i tak user nie zuważy różnicy.

0
DevilHimself napisał(a)

Zapomnijcie o precyzyjnym odmierzaniu czasu pod Win32, jeden maleńki trojanek, robaczek i Win32 zaczyna przekłamywać zegar. Rozwiązaniem byłoby wykorzystanie któregoś timera na płycie głownej ale przecież nasz genialny m$ blokuje dostęp do hardware z poziomu asma. Win32 nie nadaje się do mierzenia czasu.

To są oczywiste bzdury - z tego względu, że windowsowa funkcja pobierania czasu oparta jest o wartość czasu pobieraną z BIOS-u,więc niezaleznie od zapchania systemu zadaniami, czas jest odliczany hardware'owo.

na dokładne odliczanie czasu pozwoli Ci instrukcja procesorów poząwszy 586 - RDTSC, która zwraca w EDX:EAX 64 bitową liczbę taktów od uruchomienia procesora. Przybliżoną liczbę taktów zegara CPU na sekundę mozna pobrać za pomocą odwołania do uslugi WMI.

a w przypadku braku dostępu do hardware'u z poziomu user mode - to chyba oczywiste, dlaczego tak jest - od tego masz kerel mode w WDM.

1 użytkowników online, w tym zalogowanych: 0, gości: 1