/** * Copyright 2013 (c) Anna Schumaker. */ #include #include struct idle_task { void (*idle_func)(void *); void *idle_data; }; static std::queue idle_queue; static float queued = 0.0; static float serviced = 0.0; void idle_schedule(void (*func)(void *), void *data) { struct idle_task *task = new idle_task; task->idle_func = func; task->idle_data = data; idle_queue.push(task); queued++; } bool idle_run_task() { if (idle_queue.size() > 0) { idle_queue.front()->idle_func(idle_queue.front()->idle_data); delete idle_queue.front(); idle_queue.pop(); serviced++; } if (idle_queue.size() > 0) return true; queued = 0.0; serviced = 0.0; return false; } float idle_progress() { if (idle_queue.size() == 0) return 1.0; return serviced / queued; }