Форум: "KOL";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];
ВнизРабота с потоками Найти похожие ветки
← →
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 вся ветка
Форум: "KOL";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.078 c