Реализация интерфейса интервью - PullRequest
6 голосов
/ 07 мая 2011

Не могли бы вы помочь мне со следующим вопросом интервью.

Данная функция Sleep(int seconds) реализует следующий интерфейс, чтобы можно было использовать таймеры:

  • функция void CreateTimer(void (*func)(), int seconds), что ее целью является создание таймера
  • функция void StartTimers(), что ее цель запустить все таймеры

Каждый таймер, который запускается, должен задерживаться на несколько секунд, а затем использовать обратный вызов для вызова функции. Пример:

CreateTimer(func1,3);
CreateTimer(func2,7);
CreateTimer(func3,10);
StartTimers()

Должно произойти следующее:

Задержка на 3 секунды, а затем вызов функции 1. Задержка на 4 секунды, а затем вызов функции 2. Задержка на 3 секунды, а затем вызов функции 3.

Вопрос в том, как реализовать такой интерфейс?

Ответы [ 3 ]

3 голосов
/ 07 мая 2011

РЕДАКТИРОВАТЬ 1: Используйте API вопросов.

РЕДАКТИРОВАТЬ 2: Упс, не вызывал q.pop ();

Это звучит как работа для std::priority_queue, заказанной в срок.

//pseudo-code
class Job;
std::priority_queue<Job, std::vector<Job>, CompareLessByDeadline> q;

CreateTimer(func, deadline) {
   q.push(Job(func, deadline));
}
StartTimers() {
  now = 0;
  while(!q.empty()) {
    Job& j = q.top();
    Sleep(j.deadline-now);
    now = j.deadline;
    j.function();
    q.pop();
  }
}
1 голос
/ 07 мая 2011
//globals vector v1; vector v2;

CreateTimer(func, delay) {  
v1.push_back(func);  
v2.push_back(delay); }


StartTimers() {   startDelay=0;  
for(i=0; i<v2.size; i++)   {
    sleep(v2[i]-startDelay);
    *v1[i]   //call the function
    startDelay=v2[i];   }

}
1 голос
/ 07 мая 2011

Код psuedo может выглядеть примерно так:>

  1. Создать глобальный словарь типа
  2. В функции создания таймера продолжайте добавлять два параметра в словарь
  3. В функции таймера запуска вызовите каждый из функций после сна их соответствующего значения в словаре
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...