Главная страница
    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.078 c
1-1123129963
dreamse
2005-08-04 08:32
2005.08.21
Проблема с пониманием программы пути


8-1113305016
Crazzy Jazzy
2005-04-12 15:23
2005.08.21
Создание кнопки с эффектом стекла...


1-1123000525
deamon_t
2005-08-02 20:35
2005.08.21
Вызов функции


1-1122889264
sCORpio80
2005-08-01 13:41
2005.08.21
Вернуть параметр из MDI-Child


1-1122557134
syte_ser78
2005-07-28 17:25
2005.08.21
Рекурсивная распаковка многоуровневого архива с сохранением древи





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