Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.48 MB
Время: 0.04 c
1-1081074775
Serious Sam
2004-04-04 14:32
2004.04.18
Как сделать, чтобы приложение запускалось в определенное время?


1-1080646782
Mazer
2004-03-30 15:39
2004.04.18
Автоматически загрузить в Image картинку jpg, gif, bmp... как?


3-1079946231
Крутыш
2004-03-22 12:03
2004.04.18
SyBase


14-1080148474
micc
2004-03-24 20:14
2004.04.18
TCanvas и ScanLine


4-1076663589
Max_Ivanych
2004-02-13 12:13
2004.04.18
Эмуляция нажатия клавиши в DOS - приложении





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