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

Вниз

Работа с потоками   Найти похожие ветки 

 
Ajax ©   (2005-01-14 14:28) [0]

Мне нужно создавать некоторое  (заранее неизвестное) количество потоков. В каждом потоке должны выполняться одни и те же действия, но с разными параметрами. Потоки создаю

NewThreadAutoFree(TOnThreadExecute(MakeMethod(nil, @MyThreadExecute)));

Все необходимые действия выполняются в

function MyThreadExecute(Sender:PThread): Integer;
begin
//Те самые действия
end;


Так вот вопросы. Правильно ли я делаю в плане того, что не забочусь о освобождении потока? Не будет ли утечек ресурсов? Как передавать параметры для действий в MyThreadExecute?

Спасибо.


 
RA ©   (2005-01-14 14:48) [1]

У потока есть свойство tag. Забей туда указатель на свои параметры.
type PData=^TData
TData=record
par1,par2:string;
end;
Вроде того.


 
Ajax ©   (2005-01-14 17:34) [2]

Спасибо, попробую.

А насчет утечки ресурсов?


 
Ajax ©   (2005-01-14 18:12) [3]

Не понимаю, почему следующий код не работает.

type
PParam = ^TParam;
TParam = record
  StrParam : string;
  IntParam : integer;
end;

function MyThreadExecute(Sender:PThread): Integer;
var p:PParam;
begin
p:=Sender.Data;
ShowMessage( p^.StrParam+chr(13)+
            Int2Str(p^.IntParam) );
Result:=0;
Dispose(p)
end;

Procedure MyCreateThreads();
var
 p : PParam;
 x : integer;
begin
for x:=1 to 9 do
 begin
   new(p);
   p^.StrParam:="Param "+Int2Str(x);
   p^.IntParam:=x;
   NewThreadAutoFree(TOnThreadExecute(MakeMethod(nil, @MyThreadExecute))).Data:=p;
 end;
end;


 
Ajax ©   (2005-01-14 18:14) [4]

Забыл сказать. Acces violation на строке p:=Sender.Data;


 
Vladimyr ©   (2005-01-15 00:04) [5]

> А насчет утечки ресурсов?
Используй MemProof.


 
Владимир Кладов   (2005-01-15 08:54) [6]

запусти поток Suspended. NewThreadAutoFree запускает поток сразу, если присвоено событие. Глобальная переменная как параметр чем не устраивает.


 
Ajax ©   (2005-01-15 13:13) [7]

>[5] Vladimyr ©   (15.01.05 00:04)
>Используй MemProof.
Это с точки зрения практики. Я интересуюсь с точки зрения теории.

> [6] Владимир Кладов   (15.01.05 08:54)
>запусти поток Suspended

Вроде никакой разницы, создавать suspended и тут же запускать или создавать через NewThreadAutoFree. Причем результат прогона тоже одинаковый - вылетает при попытке обратиться к Sender.Data.

>Глобальная переменная как параметр чем не устраивает.
Всем устраивает. Так и сделаю, если не получится через PThread.Data.

property Data : Pointer read FData write FData;
{* Custom data pointer. Use it for Youe own purpose. }

Хочу использовать даденное мне средство по назначение и не могу - обидно. Подскажите пожалуйста, что не так.


 
SPeller ©   (2005-01-15 15:52) [8]

http://www.kolnmck.ru/faq.htm#12
Dummy !!!


 
Ajax ©   (2005-01-15 16:32) [9]

Спасибо.


 
Владимир Кладов   (2005-01-15 22:25) [10]

ссылка ведет куда-то, но это не то.

Если запустить поток не Suspended, то он начнет работать до того, как выполниться .Data:=p;

так что там будет nil.

Память и потоки надо освобождать, если планируется работать в win9x или прога будет работать сутками, неделями, месяцами...


 
RA ©   (2005-01-17 11:10) [11]

Попробуй делать так
p:=PParam(Sender.Data);
И проверять на nil тоже не мешало бы.


 
Ajax ©   (2005-01-17 23:11) [12]

Всем спасибо. Разобрался. Действительно нужно было подсовывать Dummy:Pointer в объявлении MyThreadExecute и создавать поток Suspended.



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

Текущий архив: 2005.08.21;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.026 c
4-1119721366
Fanny
2005-06-25 21:42
2005.08.21
GetCurrentDirectory глючит :(


14-1122896571
Exchanger
2005-08-01 15:42
2005.08.21
Электроника, мебель, обмен ссылками, работа


3-1121284333
BBCHa
2005-07-13 23:52
2005.08.21
Округление средствами SQL


1-1122974812
kyn66
2005-08-02 13:26
2005.08.21
Listbox с разными картинками из TImageList


14-1122395767
Kerk
2005-07-26 20:36
2005.08.21
Гениальные коменты в коде....