2011-05-06 11 views
6

Podría ayudarme con la siguiente pregunta de entrevista.Implementación de interfaz de pregunta de entrevista

función Sleep(int seconds) Dada aplicar interfaz siguiente manera temporizadores se podrían utilizar:

  • función void CreateTimer(void (*func)(), int seconds) que su propósito es crear temporizador
  • función void StartTimers() que su objetivo para iniciar todos los temporizadores

Cada temporizador que se inicie debe demorar varios segundos y luego usar una devolución de llamada para llamar a una función. Ejemplo:

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

El folowing debería estar sucediendo:

Delay durante 3 segundos y luego llamar para la función 1. Delay durante 4 segundos y luego llamar para la función 2. Delay durante 3 segundos y luego llame para la función 3.

La pregunta es cómo implementar tal interfaz?

+0

Si se trata de una pregunta de la entrevista en su entrevista, ¿no deberías estar respondiendo a usted mismo? –

+9

No fue en mi entrevista. Hay muchas preguntas de entrevista en este sitio que la gente pregunta aquí, así que no veo ningún problema especial – Yakov

+1

¿Todos los temporizadores comienzan al mismo tiempo o se ejecutan uno tras otro? Si lo primero, solo puede funcionar si las devoluciones de llamadas toman un tiempo insignificante para ejecutarse. De lo contrario, las demoras serán desactivadas. –

Respuesta

3

EDIT 1: Use la API de preguntas.

EDIT 2: Vaya, no llamó a q.pop();

Esto suena como un trabajo para std::priority_queue, ordenado por fecha límite.

//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

El pseudo código podría ser algo como>

  1. Crear un diccionario global de tipo
  2. En crear función de temporizador, seguir añadiendo los dos parámetros en el diccionario
  3. En función de temporizador de inicio, llame a cada uno de los funcs después de un Sleep de su valor respectivo en el diccionario
+0

Realmente no necesita un diccionario aquí. Cualquier lista ordenada/matriz/vector hará. – hammar

+0

necesitará mantener un registro de la hora en cada función. entonces una matriz/lista de una sola dimensión no funcionará. Necesitas dos dimensiones. – neebz

+0

Quise decir una lista de funciones emparejadas con retrasos, por supuesto. Solo digo que como los quieres volver a poner en el mismo orden en que los pones, no hay necesidad de un diccionario. – hammar

1
//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]; } 

} 
Cuestiones relacionadas