Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с потоками [D6, WinXP]


Ajax ©   (2005-01-14 14:28:00) 

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

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

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

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


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

Спасибо.


Ajax   (2005-01-17 23:11:00) [1]

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


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

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


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

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

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

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

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


Ajax   (2005-01-15 16:32:00) [4]

Спасибо.


SPeller   (2005-01-15 15:52:00) [5]

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


Ajax   (2005-01-15 13:13:00) [6]

>[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. }

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


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

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


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

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


Ajax   (2005-01-14 18:14:00) [9]

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


Ajax   (2005-01-14 18:12:00) [10]

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

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 17:34:00) [11]

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

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


RA   (2005-01-14 14:48:00) [12]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо