Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.031 c
14-1122366942
Андрей Жук
2005-07-26 12:35
2005.08.21
Глюки при работе программы на многопроцессорной машине


4-1120221696
Pearled
2005-07-01 16:41
2005.08.21
Помогите создать DACL


14-1122466072
desam
2005-07-27 16:07
2005.08.21
jimm


3-1121166715
Максим
2005-07-12 15:11
2005.08.21
Работа с полями DBGrid ?


8-1113616597
Ivanov
2005-04-16 05:56
2005.08.21
Image из .pak - файла





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