Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.016 c
2-1147248335
VtalZ
2006-05-10 12:05
2006.05.28
Начинающим


2-1147366443
BAngel
2006-05-11 20:54
2006.05.28
SaveDialog


6-1138786688
Denin
2006-02-01 12:38
2006.05.28
NetUserSetGroups - не могу переместить пользователя из группы.


1-1145453390
Uriy
2006-04-19 17:29
2006.05.28
Transporent на канве


2-1147156430
EvgeniyC
2006-05-09 10:33
2006.05.28
Здраствуйте! Вопрос: Можно ли сохранить в граф. файл?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский