Форум: "Основная";
Текущий архив: 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