Precyzyjny licznik czasu

Odpowiedz Nowy wątek
RJM
2006-09-30 17:10
RJM

Rejestracja: 13 lat temu

Ostatnio: 3 lata temu

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>

Pozostało 580 znaków

2006-09-30 17:57

Rejestracja: 16 lat temu

Ostatnio: 6 lat temu

0

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

Pozostało 580 znaków

2006-09-30 17:59

Rejestracja: 13 lat temu

Ostatnio: 6 lat temu

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.

Pozostało 580 znaków

mega_lama
2006-10-01 01:38
mega_lama
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 

Pozostało 580 znaków

2006-10-02 20:26

Rejestracja: 13 lat temu

Ostatnio: 11 lat temu

0

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


(Slackware Linux 12.0)&&(WinXP - gry)&&(firefox)&&(opera)&&(!(IE))

Pozostało 580 znaków

RJM
2006-10-02 22:16
RJM

Rejestracja: 13 lat temu

Ostatnio: 3 lata temu

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

Pozostało 580 znaków

quantum idiot
2006-10-03 03:02
quantum idiot
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

Pozostało 580 znaków

2006-10-03 08:53

Rejestracja: 13 lat temu

Ostatnio: 13 lat temu

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.

Pozostało 580 znaków

2006-10-03 09:04

Rejestracja: 16 lat temu

Ostatnio: 6 lat temu

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.

Pozostało 580 znaków

_gracz
2006-10-04 18:31
_gracz
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.

Pozostało 580 znaków

Odpowiedz

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