void APIC_Timer::oneshot(std::chrono::microseconds micros) noexcept { // prevent overflow uint64_t ticks = micros.count() * ticks_per_micro; if (ticks > 0xFFFFFFFF) ticks = 0xFFFFFFFF; // set initial counter auto& lapic = APIC::get(); lapic.timer_begin(ticks); // re-enable interrupts if disabled if (GET_TIMER().intr_enabled == false) { GET_TIMER().intr_enabled = true; lapic.timer_interrupt(true); } }
int main( int argc, char **argv ) { ALLEGRO_DISPLAY *display = NULL; ALLEGRO_EVENT_QUEUE *event_queue = NULL; //VARIABLES const int FPS =200; bool redraw = true; bool jump = false; SCR_CREATE_DISPLAY INIT_ALLEGRO_ADDONS initGameCore(); event_queue = al_create_event_queue(); timer = al_create_timer(1.0 / FPS); REGISTER_QUEUE al_clear_to_color(al_map_rgb(0,0,0)); srand(time(NULL)); al_start_timer(timer); while(!done) { ALLEGRO_EVENT ev; al_wait_for_event(event_queue, &ev); if(ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE) { done = true; } else if( (ev.type == ALLEGRO_EVENT_KEY_DOWN)||(ev.type == ALLEGRO_EVENT_KEY_UP) ) { manageKeys(ev); } if(ev.type == ALLEGRO_EVENT_TIMER) { //cout << "loop\n"; managePlayer(); //cout << "going for progress\n"; AnimatorHolder::Progress( GET_TIMER(timer) ); terrain->drawTerrain(); AnimatorHolder::Draw(); //cout << "leaving for progress\n"; DestructionManager::Commit(); al_flip_display(); al_clear_to_color(al_map_rgb(0,0,0)); } } DESTROY_SEQ return 1; }
void CHiFreqTimer::TimingDetails::Setup() { LARGE_INTEGER freq; if (QueryPerformanceFrequency(&freq) == 0) { MessageBox(0, "Timer not supported", "Error", MB_OK); exit(0); } perFreq = ((double)freq.QuadPart) / 1000; nextTimer = curBase = curManualBase = 0; int i, loops = 1000; void* Fred = GetCurrentThread(); int CurPri = GetThreadPriority(Fred); SetThreadPriority(Fred, THREAD_PRIORITY_HIGHEST); Sleep(100); LARGE_INTEGER pTest; {TIME_SCOPE("ss overhead") for (i = 0; i < loops; i++) { QueryPerformanceCounter(&pTest); QueryPerformanceCounter(&pTest); QueryPerformanceCounter(&pTest); QueryPerformanceCounter(&pTest); QueryPerformanceCounter(&pTest); QueryPerformanceCounter(&pTest); QueryPerformanceCounter(&pTest); QueryPerformanceCounter(&pTest); QueryPerformanceCounter(&pTest); QueryPerformanceCounter(&pTest); } } startstopOverhead = GET_TIMER("ss overhead").getTotalTime() / (loops * 10); CLEAR_TIMERS for (i = 0; i < loops; i++) {TIME_SCOPE("nested") {TIME_SCOPE("sub") }} nestedOverhead = GET_TIMER("nested").getAverageTime(); CLEAR_TIMERS for (i = 0; i < loops; i++) {TIME_SCOPE("nested") { TIMER_START("sub") TIMER_STOP("sub") } } manualNestedOverhead = GET_TIMER("nested").getAverageTime();// * 1.4; CLEAR_TIMERS #ifdef _CLOCKTICKS // Look at clock speed __int64 res; {TIME_SCOPE("ticktock") _asm { rdtsc push eax push edx } testfun(); _asm { rdtsc pop ebx sub edx, ebx pop ebx sub eax, ebx mov dword ptr [res], eax mov dword ptr [res+4], edx } } clockSpeed = res / GET_TIMER("ticktock").getTotalTime(); CLEAR_TIMERS #endif SetThreadPriority(Fred, CurPri); }
unsigned long get_timer(unsigned long base) { return(GET_TIMER(base)); }
void APIC_Timer::stop() noexcept { GET_TIMER().intr_enabled = false; APIC::get().timer_interrupt(false); }