Рейтинг:
7
Jochen Arndt
Никогда не использовать Sleep()
в основном потоке (GUI).
Как уже упоминалось, существует множество ресурсов о потоках.
Вот такой пример Использование Рабочих Потоков[^].
На основе этой статьи вы должны создать рабочий поток и событие для остановки потока. Тогда функция рабочего потока может выглядеть следующим образом:
/*static*/ UINT CMyThreadClass::ThreadFunc(LPVOID p)
{
CMyThreadClass * self = (CMyThreadClass *)p;
bool bStop = false;
while (!bStop)
{
switch (::WaitForSingleObject(self->m_StopEventHandle, 50))
{
case WAIT_OBJECT_0 :
bStop = true;
break;
case WAIT_TIMEOUT :
// Generate signal here
break;
}
}
return 0;
}
Хотя это обеспечивает лучшую точность синхронизации, чем обычный таймер, он все равно не будет абсолютно точным. Если вы используете, например, блокировку вызовов сокетов в рабочем потоке, возможно, потребуется соответствующим образом скорректировать значение тайм-аута, измерив время выполнения.
Member 12208944
То, что я понял, я и пишу:
Мне нажать одну кнопку, кнопку функция будет иметь функцию afxbeginthread функции для вызова функции threadfunc войти в цикл while, то, что происходит, откуда m_stopeventhandle придет , если он является членом кнопка функций waitforsingleobject ждать 50 мс после отключения генерации сигнала сразу после перерыва конец цикла while, я хочу, чтобы каждый 50мс частота генерации сигнала без зависания другой функции таймеры потоков одного приложения, если я ошибаюсь в понимании, может у объясните мне
Jochen Arndt
Вам нужно прочитать о потоках и понять.
В Windows вы обычно создаете класс для своего потока. Он содержит по крайней мере (статическую) функцию потока, функцию запуска, которая создает поток и запускает выполнение, и функцию остановки (которая также вызывается из деструктора).
Функция stop установит событие, чтобы сообщить потоку, что он должен покинуть свой цикл и вернуться. Он должен быть вызван при завершении вашего приложения и может быть вызван всякий раз, когда вы хотите остановить поток.
Функции WaitFor... вернутся либо при наступлении события, либо по истечении тайм-аута.
Member 12208944
Спасибо, это работает ....