Что самый чистый путь состоит в том, чтобы создать тайм-аут некоторое время цикл?

Windows API/C/C ++

1. ....  
2. ....
3. ....    
4.    while (flag1 != flag2)
5.    {
6.      SleepEx(100,FALSE);   
        //waiting for flags to be equal (flags are set from another thread).
7.    }
8. .....
9. .....  

Если бы флаги не равняются друг другу после 7 секунд, я хотел бы продолжить выравнивать 8.

Любая справка ценится.Спасибо.

7
задан T.T.T. 25 January 2010 в 22:06
поделиться

7 ответов

Если вы ждете, когда у вас есть определенный флаг, который будет установлен или время для достижения, гораздо более чистое решение может заключаться в использовании события автоматического / ручного сброса. Они предназначены для условий сигнализации между потоками и имеют очень богатые API, разработанные на них. Например, вы можете использовать API queptormultiPleObjects, которые требуют явного значения тайм-аута.

10
ответ дан 6 December 2019 в 07:06
поделиться

Не выбирайте флаги для изменения. Даже сон или выход во время цикла, это просто тратит циклы ЦП.

Вместо этого получают тему, которая устанавливает флаги, чтобы сигнализировать вас, что они были изменены, вероятно, используя событие . Ваше ожидание на мероприятии принимает тайм-аут, который вы можете настроить, чтобы позволить дождаться 7 секунд всего.

Например:

Thread1:

 flag1 = foo;
 SetEvent(hEvent);


 Thread2:

 DWORD timeOutTotal = 7000;  // 7 second timeout to start.
 while (flag1 != flag2 && timeOutTotal > 0)
 {
     // Wait for flags to change
     DWORD start = GetTickCount();

     WaitForSingleObject(hEvent, timeOutTotal);

     DWORD end = GetTickCount();

    // Don't let timeOutTotal accidently dip below 0.
    if ((end - start) > timeOutTotal)
    {
        timeOutTotal = 0;
    }
    else
    {
       timeOutTotal -= (end - start);
    }

 }
6
ответ дан 6 December 2019 в 07:06
поделиться

Вы можете использовать QueryPerFormancounter из WinAPI. Проверьте его до того, как запускаются, а запрос, если прошедшее количество времени. Однако это таймер высокого разрешения. Для использования более низкого разрешения GetTickCount (миллисекунды).

Все зависит, активно ли вы активно ждете (делаете что-то) или пассивно ждете внешнего процесса. Если последний, тогда следующий код с использованием сон будет намного проще:

int count = 0;
while ( flag1 != flag2 && count < 700 )
{
   Sleep( 10 ); // wait 10ms
   ++count;
}

Если вы не используете сон (или выход), и ваше приложение постоянно проверяется на условиях, то вы вы Bloat The CPU приложение работает на.

Если вы широко используете WinAPI, вы должны попробовать более нативное решение, прочитал функции синхронизации WinAppi .

3
ответ дан 6 December 2019 в 07:06
поделиться

Вы не упомянули, что произойдет, если флаги равны.

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

Ваша лучшая ставка - использовать событие и использовать функцию WaitForsingleObject с 7000 миллисекундным временем.

3
ответ дан 6 December 2019 в 07:06
поделиться

Java 6 доступна для ОС X. Проверьте обновление программного обеспечения. После этого установите его в качестве версии Java по умолчанию, а затем выполните компиляцию.

-121--3165671-

Сообщество IIS имеет множество инструментов для мониторинга производительности.

http://www.iis.net/downloads/Performance

-121--2695420-

Если ваше приложение выполняет некоторые сетевые функции, посмотрите на вызов POSIX select (), особенно на функцию тайм-аута!

0
ответ дан 6 December 2019 в 07:06
поделиться

Убедитесь, что вы делаете Sleep () или нынешний выход () , или вы будете съесть весь весь ЦП (или ядро) ждет Отказ

2
ответ дан 6 December 2019 в 07:06
поделиться

Я бы сказал: "Проверьте время и если через семь секунд ничего не случилось, то разорвите петлю".

1
ответ дан 6 December 2019 в 07:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: