Форум: "Основная";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];
ВнизКак прекратить поток? Найти похожие ветки
← →
Layner © (2004-04-02 10:46) [0]Приветствую всех! Проблемка такая, стартую потоки в цикле так:
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
for i:=1 to 10 do
begin
T1[i] := TSendThread.Create(False);
T1[i].FreeOnTerminate := True;
end;
end;
"Прибивать" пробовал так, выдает ошибку..
procedure TForm1.Button4Click(Sender: TObject);
var
i:integer;
begin
for i:=1 to 10 do
begin
T1[i].Terminate;
T1[i].Free;
end;
end;
← →
Семен Сорокин © (2004-04-02 10:56) [1]
procedure TForm1.Button4Click(Sender: TObject);
var
i:integer;
begin
for i:=1 to 10 do
begin
T1[i].Terminate;
T1[i].WaitFor;
T1[i].Free;
end;
end;
← →
Внук © (2004-04-02 10:56) [2]T1[i].FreeOnTerminate:= True;
....
T1[i].Terminate;
T1[i].Free;
И как это понимать?
← →
Layner © (2004-04-02 11:05) [3]T1[i].FreeOnTerminate:= False;
Да, с этим не доработал, но потоки все равно не уничтожаются.. написал как Семен Сорокин © (02.04.04 10:56) советовал.
← →
Внук © (2004-04-02 11:10) [4]И не уничтожатся, если в методе Execute потокового объекта нет реакции на флаг Terminated
← →
Layner © (2004-04-02 11:13) [5]А, все, понятно!
Спасибо!
← →
Семен Сорокин © (2004-04-02 11:15) [6]2Layner
глянь сюда:
...\Borland\Delphi5(6,7)\Demos\Threads
← →
Тимохов © (2004-04-02 11:20) [7]я бы еще так написал
T1[i] := TSendThread.Create(true);
T1[i].FreeOnTerminate := True;
T1[i].resume;
← →
Layner © (2004-04-02 11:29) [8]А ещё вопрос, можно ли как нибудь узнать из ф-и, какой поток ее вызвал? Т.е. что то типа этого
s:=IntToStr(Integer(@Self)); //в строчку вписали, какой № потока ее вызвал.
Send_udp("127.0.0.1", 15478, s); //моя ф-я, которая шлёт сообшения по UDP.
В результате на приеме пакета вижу:19595112
17497960
18546536
16449384
20643688
22740840
21692264
23789416
25886568
24837992
(10 потоков)
← →
Layner © (2004-04-02 11:30) [9]Только вместо номера 1,2,3... эти цифры.
← →
Defunct © (2004-04-02 11:30) [10]> Как прекратить поток?
TerminateThread()
← →
panov © (2004-04-02 12:10) [11]>Layner © (02.04.04 11:29) [8]
А ещё вопрос, можно ли как нибудь узнать из ф-и, какой поток ее вызвал?
ты же сам привел ответ?-)
s:=IntToStr(Self.handle)
← →
Layner © (2004-04-02 13:45) [12]s:=IntToStr(Self.handle) :)
Сам то сам :), просто я потоки формирую от одного до 100 например, и узнать бы номер от одного до 100, а не 8ми значное число.. Кстати, IntToStr(Self.handle) возвращает 3х цифровой код, у потока он одинаков, но только в одном периоде работы. если заново запустит программу, то цифры уже будут другие..
← →
Digitman © (2004-04-02 13:58) [13]
> А ещё вопрос, можно ли как нибудь узнать из ф-и, какой поток
> ее вызвал?
GetCurrentThreadId
← →
Семен Сорокин © (2004-04-02 14:01) [14]как вариант решения
type
TSendThread = class(TThread)
private
...
FID: integer;
public
constructor Create(ACreateSuspended: boolean; AID: integer); reintroduce;
...
end;
constructor TSendThread.Create(ACreateSuspended: boolean; AID: integer);
begin
FID := AID;
inherited Create(ACreateSuspended);
end;
.... в программе
var
i: integer;
begin
for i:=1 to 10 do
T1[i] := TSendThread.Create(False, i);
end;
...
Send_udp("127.0.0.1", 15478, IntToStr(self.FID));
← →
Layner © (2004-04-02 14:12) [15]Digitman © (02.04.04 13:58)
Интересно, протестил, но это тоже шлет уникальное число для каждого потока, из нескольких цифр.
Семен Сорокин © (02.04.04 14:01)
Спасибо Семен за решение! Т.е. тут как бы передаем значение i через защищенную переменную. Понятно. Реализовал, классно, сейчас по сети буду гонять UDP пакеты, тестить приложение! :)
← →
panov © (2004-04-02 14:24) [16]Ты не от той печки пляшешь.
Плясать надо от потока-потомка, а не от родителя.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.04.18;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.037 c