2010-11-09 7 views
0
void Wait(double Duration) 
{ 
    clock_t End; 
    End = clock() + (Duration*CLOCKS_PER_SEC); 

    while (clock() < End) 
    { 
     // This loop just stalls the program. 
    } 
} 

Моя функция работает отлично в полтора раза, но иногда она задерживает программу до ее даже вызова. Возьмем, например, следующий фрагмент кода:Почему этот выход ждет чего-то после него?

cout << "This is\n"; 
Wait(2.5) 
cout << "a test!"; 

Вы бы ожидать, что первая строка появится сразу, а вторая линия появится через 2,5 секунды, но иногда все появляется через 2,5 секунды. В чем дело?

+1

Существует почти наверняка лучший способ сделать то, что вы действительно хотите сделать. Сообщите нам свою платформу/компилятор, и мы можем дать лучший совет. –

+0

Это происходит только для вас с помощью cout? Имейте в виду, что он буферизирован. Поэтому, если вы не флеш, я думаю, вы можете получить поведение, которое вы испытываете. – Bart

+0

Я не уверен, что это правильно, но возможно ли, что компилятор оптимизирует цикл, поскольку он ничего не делает? См. Этот вопрос: http://stackoverflow.com/questions/3592557/optimizing-away-a-while1-in-c0x – AshleysBrain

ответ

4

попробовать

cout.flush(); 

перед вашим Wait

2

Try cout << "This is" << endl;

Это выглядит как буферизация, а не часы выпуска.

4

Это может быть из-за буферизации ввода/вывода. Вы должны очистить выходной буфер (либо попробуйте << endl вместо '\n', либо напишите cout.flush) вручную.

2

Флеш()/std :: endl уже упоминался - но вы намерены действительно потреблять 100% одного ядра, пока вы ждете? Это то, что делает цикл while()! Если вы хотите лучше подход к "ожидание", рассмотрим одно из следующих действий:

  1. повышающего :: Thread :: сна() - миллисекунды детализацию
  2. тревоги (1) второй Гранулярность
  3. выберите()
  4. pthread_cond_timedwait()

т.д.