2013-04-30 6 views
1

Интересно, есть ли способ рассчитать прошедшее время в C++, не блокируя выполнение и, если возможно, избегая потоков.Время отсчета, прошедшее в C++, без блокировки, без потока

Ситуация: создается бомба и должна взорваться через 5 секунд. Можем ли мы избежать создания потока, который будет спать 5 секунд, пока взрыв не убьет себя?

+1

Вы должны переименовать свой вопрос что-то вроде - сон в течение некоторого времени без блокировки. AFAIK, нет никакого способа сделать это без потоков. –

+1

Хорошо спасибо, мы были на 98% уверены, что у них не было никаких решений, но мы должны были спросить. Спасибо Nemanja – 2013-04-30 14:27:56

+2

@Mayerz: Ну, если вам просто нужно подсчитать время, вы можете использовать [std :: chrono :: system_clock] (http://en.cppreference.com/w/cpp/chrono/system_clock), чтобы получить время до этого после выполнения некоторого фрагмента кода и вычисления разницы для получения прошедшего времени. Но это то, о чем вы просите? – ereOn

ответ

1

У вас может быть счетчик времени без блокировки, просто назовите его время от времени в середине выполнения ваших обычных действий. Как только будет тайм-аут - сделайте то, что вам нужно. Таким образом, не требуется дополнительная нить.

#include <ctime> 

// start counter with current second 
time_t counter = time(0); 

// we need to wait 5 seconds 
time_t timeout = 5; 

bool exit = false; 

void handle_timeout() 
{ 
    exit = true; 
} 

void func() 
{ 
    while(!exit) 
    { 
     // do something 

     if (time(0) - counter > timeout) 
      handle_timeout(); 

     // yeild() or sleep(0) can be put here, to avoid 100% cpu load in case of high load 
    } 
} 

int main() 
{ 
    func(); 
} 
+0

Хорошо, сна (0) представляется решением для не 100% -ной загрузки процессора. Подождите еще несколько комментариев, но вы на самом деле выигрышный ответ! – 2013-05-02 11:08:02

1

Использование std::chrono вы можете использовать нелипкая истекшее таймер следующим образом

вызов это в начале желаемого измерения времени:

std::chrono::steady_clock::time_point begin_time = std::chrono::steady_clock::now(); 

вызова этого в конце требуемое измерение времени:

std::chrono::steady_clock::time_point end_time = std::chrono::steady_clock::now(); 

вычислить переходное время Время d:

std::chrono::steady_clock::time_point elapsed = end_time - begin_time; 

Если низкое разрешение требуется, например, как несколько минут или часов, std::chrono могут быть адаптированы с помощью std::chrono::steady_clock::minutes(/*num minutes*/) или `std::chrono::steady_clock::hours(/*num hours*/)

+0

Это нормально, я знал об этом методе. Но если я использую это в своем цикле, он будет как бесконечный цикл за время, необходимое для действия (виртуальное время действия, например 5 секунд, если я это сделаю, потому что действие мгновенно) Надеюсь, вы поняли меня. – 2013-05-02 11:05:40

+1

upvote для решения C++ с использованием stl;) – 2013-05-02 15:17:36

+0

Вам нужно сделать только два вызова внутри вашего кода; сначала для извлечения текущего времени, а затем еще один вызов для получения конечного времени. Когда вы готовы открыть прошедшее время, вычтите конец с начала и там у вас есть. – Mushy

Смежные вопросы