ожидание времени, чтобы пройти без занятого ожидания в окнах C - PullRequest
1 голос
/ 19 апреля 2011

У меня есть нить, чья работа заключается в отправке сообщений на узлы UDP.потоки отправляют сообщения, если применяется одно из следующих условий:

1) прошло определенное время с момента последней отправки сообщения (например, тайм-аут).

2) логическое обновлениеФлаг в разделяемой структуре был поднят другим потоком.

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

самый простой способ, которым яЭто можно сделать, создав цикл, который повторяется до тех пор, пока не будет выполнено одно из условий.Я боюсь, что он занят ожидания и будет тратить много процессорного времени на пустые места.Я тоже не хочу использовать sleep ().

Я не против решения C ++, если его легко понять и реализовать, поскольку я не очень знаком с C ++.

Спасибо!

Ответы [ 4 ]

10 голосов
/ 19 апреля 2011

Для окон используйте событие (CreateEvent) вместо bool, затем WaitForSingleObject для него.

2 голосов
/ 19 апреля 2011

Для сигнала между нитями я согласен с Эриком. Используйте объект события.

Для проблемы тайм-аута вы можете использовать CreateWaitableTimer () и SetWaitableTimer () .

Чтобы дождаться в потоке события, чтобы получить сигнал или таймер закончился, вы можете использовать функцию ожидания WaitForMultipleObjects (). Вы можете передать массив дескрипторов (= дескриптор события и дескриптор таймера), чтобы дождаться, когда они получат сигнал.

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

0 голосов
/ 19 апреля 2011

Я бы использовал WaitForMultipleObjects, прослушивая 2 события. Первый - выйти из потока, а второй - выполнить работу.

Примерно так ...

DWROD dwTimeOut = .....;


DWORD dwRetValue = WaitForMultipleObjects(2, hEvents, false, dwTimeOut);

if( (dwRetValue ==  WAIT_TIMEOUT) || (dwRetValue == (WAIT_OBJECT_0 + 1)))
{
  // Do Work

}
else if(dwRetValue == WAIT_OBJECT_0)
{
  // End Thread

}
else
{
  // Deal with Error
}
0 голосов
/ 19 апреля 2011

Скорее всего, вы хотите использовать процедуру обратного вызова, встроенную в поток. См. Что такое «обратный вызов» в C и как они реализованы? для объяснения и ознакомления с примером C в этой вики example , который реализует обратный вызов в качестве указателя на функцию. Проще использовать каркас событий какого-либо типа (как предложено Эриком и др.), А не бросать свой собственный, но это полезный навык, чтобы иметь в своем арсенале хитрости.

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