2011-05-06 12 views
6

Proszę, pomóż mi z pytaniem o wywiad.Implementacja interfejsu wywiadu z pytaniem

funkcja Sleep(int seconds) Biorąc realizować następujące interfejs więc może być używany czasomierze:

  • funkcję void CreateTimer(void (*func)(), int seconds), że jej celem jest stworzenie timera
  • funkcję void StartTimers() że jej celem, aby rozpocząć wszystkie liczniki

Każdy uruchomiony timer powinien opóźnić się na kilka sekund, a następnie użyć wywołania zwrotnego, aby wywołać funkcję. przykład:

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

folowing powinno mieć:

opóźnienie przez 3 sekundy, a następnie połączyć za funkcję 1. opóźnienia 4 sekundy, a następnie wymagają funkcji 2. opóźnienie przez 3 sekundy, a następnie wywołanie funkcji 3.

Pytanie, jak wdrożyć taki interfejs?

+0

Jeśli jest to pytanie wywiad w swoim wywiadzie, nie powinny być odebraniem go samodzielnie? –

+9

To nie było w moim wywiadzie. Istnieje wiele pytań do wywiadu na tej stronie, o które pytają ludzie, więc nie widzę żadnego szczególnego problemu. – Yakov

+1

Czy zegary zaczynają się w tym samym czasie, czy uruchamiają się jeden po drugim? Jeśli pierwsza, może działać tylko wtedy, gdy wywołania zwrotne zajmują mało czasu. W przeciwnym razie opóźnienia będą wyłączone. –

Odpowiedz

3

EDYCJA 1: Użyj pytania API.

EDYCJA 2: Ups, nie wywołanie q.pop();

To brzmi jak zadanie dla std::priority_queue, zamówione przed terminem.

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

Kod psuedo może być coś podobnego>

  1. Tworzenie globalnego słownika typu
  2. W utworzyć funkcję timera, dodajemy dwa parametry w słowniku
  3. W funkcji timera start, dzwonić do siebie funków po śnie ich odpowiedniej wartości w słowniku
+0

Nie potrzebujesz tutaj naprawdę słownika. Dowolna uporządkowana lista/tablica/wektor zrobi. – hammar

+0

będziesz musiał śledzić czas w odniesieniu do każdej funkcji. więc tablica/lista z jednym wymiarem nie będzie działać. Potrzebujesz dwóch wymiarów. – neebz

+0

Mam na myśli listę funkcji połączonych z opóźnieniami, oczywiście. Mówię tylko, że skoro chcesz, żeby były z powrotem w tej samej kolejności, w której je wstawiłeś, nie ma potrzeby używania słownika. – 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]; } 

} 
Powiązane problemy