Форум: "Основная";
Текущий архив: 2009.09.13;
Скачать: [xml.tar.bz2];
ВнизВопрос по работе потока (Thead) Найти похожие ветки
← →
dreamse (2008-07-02 12:56) [0]Приветствую.
Подскажите как сделать бесконечный поток который бы выполнялся постоянно.
Делаю в потоке:
procedure TMyThead.Execute;
begin
while not terminated do
begin
// код который должен постоянно проверяться в зависимости от события. Таймер ставить нельзя так как неизвестно когда событие появиться, нужно именно ждать его появления и реагировать в потоке
end;
end;
Из за этого приложение начинает загружать процесор на 99 % :(
Какие есть варианты ?
Уничтожать и создавать поток каждый раз при наступления события: не выход так как событий могут быть тысячи и нужно их сразу в потоке ставить в очередь.
← →
Поросенок Винни-Пух © (2008-07-02 13:05) [1]вызывать функции ожидания waitforsingleobject и ей подобные
← →
Германн © (2008-07-02 13:07) [2]
> код который должен постоянно проверяться в зависимости от
> события. Таймер ставить нельзя так как неизвестно когда
> событие появиться, нужно именно ждать его появления и реагировать
> в потоке
> Уничтожать и создавать поток каждый раз при наступления
> события: не выход так как событий могут быть тысячи и нужно
> их сразу в потоке ставить в очередь.
Странное совмещение синхронной и асинхронной логики работы. Изврат.
← →
Сергей М. © (2008-07-02 13:08) [3]
> Из за этого приложение начинает загружать процесор на 99
> %
Добавь в тело цикла sleep(0) и удивись
> неизвестно когда событие появиться
Так уж и неизвестно ?
Сомневаюсь)
← →
tesseract © (2008-07-02 13:15) [4]
> код который должен постоянно проверяться в зависимости от
> события.
А асинхронную процедуру или callback нельзя для обработки использовать ?
← →
dreamse (2008-07-02 13:23) [5]Спасибо. sleep помог
← →
Сергей М. © (2008-07-02 13:24) [6]
> sleep помог
Это называется "латание драных лаптей", а не решение)
← →
int64 (2008-07-02 19:09) [7]dreamse (02.07.08 12:56)
Потоком надо не мониторить событие, а обрабатывать.
← →
Loginov Dmitry © (2008-07-03 08:07) [8]> Спасибо. sleep помог
Использование Sleep() для задержки потока часто усложняет логику программы и увеличивает время реакции. С нулем также известны проблемы: если в системе, по мнению Windows, больше некому отдать квант времени, то управление немедленно вернется к твоей программе, и опять будешь грузить процессор. Используй хотябы Sleep(20), и таких проблем не будет. Твоей программе скорее всего будет все равно: 0мс или 20мс.
Целесообразно управлять потоком с помощью Эвента. Тогда Execute примет такой вид:begin
while (not Terminated) and (WaitForSingleObject(FEvent, 20) = WAIT_TIMEOUT) do
begin
end;
end;
Логика стала проще. Время реакции на завершение - меньше. Для выхода из Execute теперь достаточно вызвать SetEvent(FEvent);
← →
tesseract © (2008-07-03 19:37) [9]
> Для выхода из Execute теперь достаточно вызвать SetEvent(FEvent);
Ага, это приусловии, что код не выполняеться по полдня. Waitfor чем не люб для ожидания terminated = true ?
← →
Loginov Dmitry © (2008-07-03 20:01) [10]> Waitfor чем не люб
Тогда так:SetEvent(FEvent);
TThread.Waitfor;
или
SetEvent(FEvent);
TThread.Free;
Главное, что SetEvent(FEvent) позволяет уменьшить время реакции.
← →
GrayFace © (2008-07-05 00:27) [11]dreamse (02.07.08 12:56)
Уничтожать и создавать поток каждый раз при наступления события: не выход так как событий могут быть тысячи и нужно их сразу в потоке ставить в очередь.
Скорее всего, нужно окно+посылка сообщений ему. И уж точно никаких Sleep"ов - по-моему, они нужны только в случаях маленьких объектов, которым давать по объекту ядра слишком "жирно". Ну в некоторых очень специфических случаях.
← →
GrayFace © (2008-07-05 00:28) [12]*Ну и в некоторых очень специфических случаях.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2009.09.13;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.005 c