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

Вниз

Как прекратить поток?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.031 c
6-1077002209
Vitaliygavrilov
2004-02-17 10:16
2004.04.18
Как сделать браузер не для сети а как каталогизатор


14-1080036709
Zoloto
2004-03-23 13:11
2004.04.18
Объясните, что за ерунда


4-1076272889
Serge_
2004-02-08 23:41
2004.04.18
Реестр XP


7-1076337539
Makhanev A.S.
2004-02-09 17:38
2004.04.18
Как получить название приложения?


1-1080308282
***ghost***
2004-03-26 16:38
2004.04.18
Полноэкранный режим в Delphi?