Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.28;
Скачать: CL | DM;

Вниз

Почему прерывается выполнение 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.088 c
9-1130771485
Finsternis
2005-10-31 18:11
2006.05.28
Прошу помощи у специалистов


3-1144073895
Anton_beginer
2006-04-03 18:18
2006.05.28
XP и MDAC - не встает


9-1130783574
NightLord
2005-10-31 21:32
2006.05.28
Text в DelphiX


15-1146643657
annonymous
2006-05-03 12:07
2006.05.28
Как эмигрировать?


2-1147068883
mctarik
2006-05-08 10:14
2006.05.28
Список служебных слов в Delphi и функция Подсветки синтаксиса!