Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.11.11;
Скачать: [xml.tar.bz2];

Вниз

Как корректно завершить работу потоков в программе!?   Найти похожие ветки 

 
Zergling   (2002-10-30 06:15) [0]

Доброго всем дня! Такой вот вопрпосец мастера. Моя программа воспроизводит звуковые сообщения в потоке.
Создается очередь потоков с помощью CriticalSection. Когда я закрываю программу (а в очереди есть еще потоки), то соответсвенно чаще всего система намертво виснет.
Как избежать такой ситуации или передать сообщение всем созднным потокам в очереди что, они должны немедленно звершить свою работу (уничтожиться)?

Заранее всем спасибо


 
SottNick   (2002-10-30 07:18) [1]

if MyThrd<>nil
then
begin
MyThrd.Suspend;
MyThrd.Free;
MyThrd:=nil;
end;

должно помочь
при принудительном завершении потока память почему-то не освобождается
ЕСЛИ РЕШИШЬ ПРОБЛЕМУ, НАПИШИ



 
mmb   (2002-10-30 07:56) [2]

А чем Terminate; с FreeOnTerminate := True; не подходит?


 
Bis   (2002-10-30 08:30) [3]

2mmb
оно может подойти, если поток каким-то образом узнает о том, что нужно завершить работу. В принципе в Execute можно вставить проверку какую-нибудь на то, что программе надо срочно завершить работу. С другой стороны программа тогда должна подождать завершения всех потоков.


 
Zergling   (2002-10-30 09:30) [4]

SottNick

скорей всего твой метод подходит для уничтожения 1-го потока. Как я писал выше, у меня создаются целая пачка потоков. Вот эту пачку надо уничтожить при закрытии приложения. Такая вот проблема.


 
SottNick   (2002-10-30 09:48) [5]

2 Zergling
что это за тип такой "пачка потоков"?
или, другими словами, проделай это с каждым в цикле или как ты там их создаешь...


 
Zergling   (2002-10-30 10:54) [6]

SottNick ©
потоки создаются с помощью CriticalSection т.е. вновь созданный поток ждет пока не завершится предыдуший поток, только после завершения работы предыдущего потока, вновь созданный поток начнет свою работу. Втом то и дело, что у меня нет ни ккого массива потоков, переменная класса TThread у меня всего одна. А раз переменная одна ,наверное они с одинаковым именем. Как же я их все в цикле поубиваю??? Создавать переменные с разным именем безполезно т.к. не известно точно сколько будет воспроизводится звуковых сообщений у меня в программе, следовательно неизветсно сколько нужно для этих целей переменных.


 
Polevi   (2002-10-30 11:00) [7]

семафор тебе в руки


 
MrAngel   (2002-10-30 11:32) [8]

хмм интересный вопрос ты задал...
В моеё проге тоже есть потоки однако преждевременный выход из потока я делаю через переменную обьявленную в нём, т.е. если оно имеет TRUE то надо выходить...

В твоём же случае процедура проигрывания файла (или просто звука) не может делать такие обработки. Я вижу выход только в одном:
1. В самом начале Execute сделай FreeOnTerminate := True;
2. Когда надо сделать досрочный выход в главном модуле своей программы, где обьявлен обьект потока напиши YourThread.Terminate;
А затем YourThread.Free/ -
По идее такая фишка должна сработать...

Удачи...


 
VaS   (2002-10-30 11:38) [9]

> потоки создаются с помощью CriticalSection т.е. вновь
> созданный поток ждет пока не завершится предыдуший поток,
> только после завершения работы предыдущего потока, вновь
> созданный поток начнет свою работу.

В таком случае вопрос - зачем тебе куча потоков? Создай нитивую очередь (сделай из TQueue по аналогии с TList), добавляй туда твои звуки (или что там тебе нужно), а в единственной нитке, живущей постоянно (и убиваемой при завершении программы), разгребай эту очередь. Что-то типа:

Добавили где-то в другой (главной) нитке:


Q.Push(Music);


Обрабатываем:


procedure TTr.Execute;
begin
while not Terminated do
begin
while Q.AtLeast(1) do
begin
Play(TMusic(Q.Pop));
end;
Sleep(10);
end;
end;


 
Zergling   (2002-10-30 11:58) [10]

Polevi ©

семафор вроде бы выступает как подобие критической секции. Как они мне могут помочь в уничтожении потоков? Если можно подробней пожалуйста. Где копать то? Может я про семафоры что то не то понимаю.


 
Alex4444444444   (2002-10-30 12:03) [11]

AFAIK, Free vyzyvaet Terminate. Drugoj vopros, chto esli Execute napisano negramotno (ili esli, ne day Bog, thread suspended), to
ni Terminate, ni Free ne srabotayut: oba budut zhdat", poka Execute zavershitsya, a ona ne smozhet zavershitsya, esli ona suspended... Ya soglasen, chto luchshe imet" odin Thread i v Execute kak mozhno chashe proveryat" na Terminated. V glavnoj programme mozhno budet skazat"

Thread.Terminate;
WaitForSingleObject(Thread.Handle, ...)

Vprochem, WaitForSingleObject vstroeno v TThread.Free.


 
VaS   (2002-10-30 12:20) [12]

Так получше будет :)


procedure TTr.Execute;
begin
while not Terminated do
if Q.AtLeast(1) then
Play(TMusic(Q.Pop))
else
Sleep(10);
end;


 
Nomad.kz   (2002-10-30 15:12) [13]

я делал много потоков в одной проге, дык хранил их в TList - очень удобно. Как здесь советуют многие, в Execute надо в цикле смотреть Terminated и если true than Exit. чтобы завершить все потоки, например, можно воспользоваться таким методом:
lst:TList;
th:=TThreadMy.Create(true,...);
th.Resume;
lst.Add(th);
...
while lst.Count>0 do begin
TThread(lst[i]).Terminate;
TThread(lst[i]).WaitFor;
lst.Delete(i);
end;



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.11.11;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.007 c
1-34100
Ghost!
2002-10-30 22:00
2002.11.11
сложный вопрос


14-34191
pomka
2002-10-21 17:33
2002.11.11
Помогите кто может, плиз!!!!!!!!!!!!!!!!!!!!!!


14-34244
Bis
2002-10-23 13:36
2002.11.11
А не сделать ли из интересных глюков задачки ?


7-34262
ResTec
2002-09-06 02:16
2002.11.11
Как определить загрузку процессора: процеса?, потока (нити)?


7-34279
Digitman
2002-09-03 12:34
2002.11.11
Сканирование списков модулей, загруженных в АП тек.процесса





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский