Форум: "Основная";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];
ВнизПочему прерывается выполнение Thread? Найти похожие ветки
← →
Alex_C © (2006-04-19 16:48) [0]Я уже задавал несколько раз тут вопрос - молучил много советов но в итоге до конца проблему не удалось побороть.
Вот код (очень упрощенный):
// Это ф-ция нити которая прото пищит в динамик
procedure TBeepThread.Execute;
begin
While Beeping do
begin
Windows.Beep( 800, 80 );
Sleep( 150 );
Application.ProcessMessages;
end;
end;
// Запуск нити
procedure TForm1.Button1Click(Sender: TObject);
begin
Beeping := True;
TBeepThread.Create(False);
end;
// Останов
procedure TForm1.Button2Click(Sender: TObject);
begin
Beeping := False;
end;
Все работает, но как только мы допустим запускаем другую прогу или же минимизируем другую прогу со многими окошками, в это время писк сбивается. Как сделать чтобы он не сбивался и не зависел (максимально) от работы системы? Интересует конечно не писк - это для примера.
← →
wal © (2006-04-19 16:53) [1]> Application.ProcessMessages;
Совершенно ни к чему. Во первых бесполезен, во вторых вреден.
> но как только мы допустим запускаем другую прогу или же
> минимизируем другую прогу со многими окошками
А вот сие от тебя никак не зависит, можно только приоритет повысить.
С уважением.
← →
wal © (2006-04-19 16:56) [2]
> While Beeping do
Неплохо было бы еще Terminated проверять.
← →
Alex_C © (2006-04-19 17:01) [3]Да ну это все понятно!
Уберем Application.ProcessMessage - тот же рез-т!
Просто видел прогу, которая работая и с COM-портом, и с динамиком - не зависала от других программ, при этом в диспетчере задач приоритет у нее был как у всех... Как же так сделать?
← →
Styx_ (2006-04-19 17:10) [4]А у самой нити приоритет поменять?
← →
Alex_C © (2006-04-19 21:53) [5]Понимаешь, менять приоритет у нити бесполезно - это только влияет на раздачу процессорного времени в приложении (внутри), а от внешних программ это никак не влияет.
Для прикола менял - ноль эмоций. Давал TimeCritical.
Все же интересно, как это сделано в других прогах?
← →
Styx_ (2006-04-19 22:04) [6]Если нужен настоящий RealTime - то никак. Наилучшее приближение при выходе в нулевое кольцо.
← →
Мефисто (2006-04-19 22:43) [7]Alex_C © (19.04.06 16:48)
Возможно дело:
1. В ПК - насколько шустрое железо. У меня подобный простой код ни как не тормозит, рзве что нет работ с ком портом :) Нагружался комп игрухой TES4 Oblivion.
2. Возможно ошибка в коде. Что-то не совсем оптимизированно и кушает процессорное время.
← →
Eraser © (2006-04-19 22:43) [8]
> Alex_C © (19.04.06 16:48)
var
MyThread: TBeepThread;
// Это ф-ция нити которая прото пищит в динамик
procedure TBeepThread.Execute;
begin
While not Terminated do
begin
Windows.Beep(800, 80);
Sleep(150);
end;
end;
// Запуск нити
procedure TForm1.Button1Click(Sender: TObject);
begin
MyThread := TBeepThread.Create(False);
end;
// Останов
procedure TForm1.Button2Click(Sender: TObject);
begin
MyThread.Terminate;
end;
PS не пойму, для чего тут такой продолжительный Sleep?
← →
Мефисто (2006-04-19 22:53) [9]Eraser © (19.04.06 22:43) [8]
Скорее всего ты не понял аффтора :)
У него видать задержки случаются поболее Sleep(150);
Как я понимаю задумано равномерное пиканье (не сплошной писк, а с интервалом), но иногда сия писчалка местами затыкается.
← →
Мефисто (2006-04-19 22:57) [10]еще автору в догонку:
While Beeping do
Beeping лучше оформить, как свойство тоего класса, а не ввиде локальной переменной. А то критические секции и т.п. :)
← →
Eraser © (2006-04-19 22:57) [11]
> Мефисто (19.04.06 22:53) [9]
> но иногда сия писчалка местами затыкается.
я так думаю, что автор привел через чур упрощённый код, т.к. даже при очень загруженной системе таких огромных (что даже на слух заметно :))задержек выделения кванта времени потоку быть не может. Задержка в самом потоку, ну или в, крайнем случае, других потоках этого же процесса.
← →
Мефисто (2006-04-19 22:58) [12]а не ввиде локальной
глобальной, тоесть
← →
Мефисто (2006-04-19 22:59) [13]Eraser © (19.04.06 22:57) [11]
Знасит остается второй вариант. Ошибка в реализации программы :)
← →
Германн © (2006-04-20 02:25) [14]
> Styx_ (19.04.06 17:10) [4]
>
> А у самой нити приоритет поменять?
> <Цитата>
> Alex_C © (19.04.06 21:53) [5]
>
> Понимаешь, менять приоритет у нити бесполезно - это только
> влияет на раздачу процессорного времени в приложении (внутри),
> а от внешних программ это никак не влияет.
> Для прикола менял - ноль эмоций. Давал TimeCritical.
> Все же интересно, как это сделано в других прогах?
> <Цитата>
> Styx_ (19.04.06 22:04) [6]
>
> Если нужен настоящий RealTime - то никак. Наилучшее приближение
> при выходе в нулевое кольцо.
>
Ну, во-первых можно сначала поменять приоритет у процесса, который эту нить создаёт. Но это может создать проблемы уже для нормальных взаимоотношений сего процесса и системы. Посему наилучший ответ в [6]. Или давай точную задачу, а не "упрощённый вариант". Поскольку для очень многих задач, по жизни, не существует общего решения! Но могут существовать частные и весьма хорошие. Имхо.
← →
Германн © (2006-04-20 02:31) [15]
> Eraser © (19.04.06 22:57) [11]
>
>
> > Мефисто (19.04.06 22:53) [9]
>
>
> > но иногда сия писчалка местами затыкается.
>
> я так думаю, что автор привел через чур упрощённый код,
> т.к. даже при очень загруженной системе таких огромных (что
> даже на слух заметно :))задержек выделения кванта времени
> потоку быть не может.
Пардон. Через что автор сабжа, по-вашему, упростил код? :-)
По сути. А я вот лично уже недели две теряюсь в догадках - что творится с моим компом на работе при включении и выключении! "Шуршит" гад винтом минуты 4 при включении и минуты 2 при выключении!
← →
Мефисто (2006-04-20 08:30) [16]Германн © (20.04.06 02:31) [15]
Тогда хотелось бы услышать от автора IQ (железо) его компа.
Этож как он должен быть нагружен, чтобы так часто спикер затыкался?
Вариант номер 2: спикер в топку, юзаем DirectSound из состава DirectX :)
← →
Alex_C © (2006-04-20 08:31) [17]Ребят! Куча ответов - а по существу - ноль!
Я привел реальный код. Просто чтоб понятно было и можно было быстро попробовать. Естественно мне не писк нужен. Просто если вместо
While not Terminated do
begin
Windows.Beep(800, 80);
Sleep(150);
end;
Вставить допустим управление по ком- потру внешним уст-м - эффект 100% совпадает.
Менять приоритет нити - эффект тоже естественно ноль, как я уже писал выше.
А вот ссылка на реальную прогу которая пищит :) и не затыкается
http://www.dxsoft.com/ru/products/cwtype/
это генератор кода морзе. Вот как же в ней это все реализовано? Судя по коду - написано на Дельфи.
← →
Мефисто (2006-04-20 09:57) [18]Alex_C © (20.04.06 08:31) [17]
Уже по существу ответели. Ошибка в коде.
Как я написал выше, используя глобальную переменную
While Beeping do
Впринципе уже ошибка. Так что если ты уверен, что твой код точно без ошибок... Вдруг ты заблуждаешся?
P.S.
Тут местами хотябы раз в месяц один код всплывает из одной книжонки по синхронизации потоков. Так народ и серчает - все далаю правильно по книге. А на деле... увы неверно.
← →
Alex_C © (2006-04-20 11:38) [19]Нет ребята - ошибки никакой нет. Ответ я уже нашел - написал письмо автору вышеуказанной программы.
Его ответ выл таков:
искользовать callback функцию мультимедийного таймера.
Вот программа, которая не зависает от других программ:
procedure TimeCallBack(TimerID, Msg: Uint; dwUser, dw1, dw2: DWORD); pascal;
begin
While True do
begin
Windows.Beep( 800, 80 );
Sleep( 150 );
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
mmResult := TimeSetEvent(10, 0, @TimeCallBack, 0, {TIME_PERIODIC}TIME_ONESHOT) ;
end;
Все тоже самое - но только уже не виснет! Спасибо автору CWType!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.011 c