Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.05.2013, 12:00
ValeryB ValeryB вне форума
Прохожий
 
Регистрация: 09.05.2013
Сообщения: 15
Версия Delphi: Delphi 5
Репутация: 10
По умолчанию Потоки (Threads) в Делфи - как передать потоку параметры?

Почитав статьи, я что-то до конца не понял, как передавать потокам параметры.

Поток вызывается MyThread:=TMythread. create(false);
То, что будет выполнятся, описывается процедурой MyThread.execute, которой нельзя передать аргументы.


Как сделать, что бы одна и таже функция выполнялась в отдельном потоке, но обрабатывала разные данные ?

Например

Procedure RandomizeArray(var A:array[1....1000000] of integer]);
var x:integer
begin
for x:=1 to 1000000 do a[x]:=random(100);
end;

Надо запустить 4 этих процедуры в разных потоках, и с разными массивами. Что бы 1 функция одновременно заполняла 4 разных массива.
Ответить с цитированием
  #2  
Старый 09.05.2013, 12:17
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Все так-же как и с классами. Создаете 4 экземпляра и у каждого свой набор свойств(параметров) будет. Можно без создания класса обойтись, с помощью процедуры beginthread() тогда в качестве параметра передается указатель на структуру. Тоже создаете 4 указателя и вызываете 4 раза процедуру со своим указателем.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 09.05.2013, 13:00
ValeryB ValeryB вне форума
Прохожий
 
Регистрация: 09.05.2013
Сообщения: 15
Версия Delphi: Delphi 5
Репутация: 10
По умолчанию

Спасибо за ответ. Но я с классами что то не особо понял.
Для 4х массивов создавать 4 класса ? А если мне надо 100000 массивов забить random(100) - создавать 100000 классов ?

Не могли бы вы написать кусочек, на стандартном примере ниже, буду очень благодарен.

type
Rnd = class(TThread)
protected
procedure Execute; override;
end;
implementation

procedure Rnd.Execute;
begin
RandomizeArray(A);
end;
Ответить с цитированием
  #4  
Старый 09.05.2013, 13:25
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Смотрите здесь
Ответить с цитированием
  #5  
Старый 09.05.2013, 13:57
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Для 100000 массивов вряд ли потоки окажутся намного эффективнее поочередного перебора. Как советовал Страдалецъ, используй указатели:
Код:
type
PmillArray=^FmillArray;
FmillArray=array[1..1000000] of integer;

type
Rnd = class(TThread)
public
 pntr:PmillArray;//это указатель
 constructor Create(var massiv:FmillArray);
protected
 procedure Execute; override;
end;
implementation

constructor Rnd.Create;
 begin
  pntr:=@massiv; 
  inherited Create(False);
 end;
procedure Rnd.Execute;
 var x:integer
 begin
  for x:=1 to 1000000 do Rnd^[x]:=random(100);
 end;
При создании трэда передавай нужный массив в трэд.
Код:
var massiv:array[1..1000000] of FmillArray;
.......
MyThread:=TMythread. create(massiv[999999]);

 ...............
Ну, короче, понятно - через указатель.
Ответить с цитированием
  #6  
Старый 09.05.2013, 18:12
ValeryB ValeryB вне форума
Прохожий
 
Регистрация: 09.05.2013
Сообщения: 15
Версия Delphi: Delphi 5
Репутация: 10
По умолчанию

Спасибо всем кто ответил. Да, так всё работает - как написано в последнем примере.
Отдельное спасибо, что не начал разъяснять о бесполезности 100000 потоков, как на большенстве форумов, а просто написал код.


п.с. оказывается, я не один такой. Тут про это в ФАКЬЮ написано.

...
К примеру, функция "прослушивает" каталог на предмет файлов. Если находит, то создает нить, которая будет обрабатывать файл. Потомку надо передать имя файла, а вот как?

Странный вопрос. Я бы понял, если бы требовалось передавать данные во время работы нити. А так обычно поступают следующим образом.

В объект нити, происходящий от TThread дописывают поля. Как правило, в секцию PRIVATE. Затем переопределяют конструктор CREATE, который, принимая необходимые параметры заполняет соответствующие поля. А уже в методе EXECUTE легко можно пользоваться данными, переданными ей при его создании.

...

http://www.delphisources.ru/pages/fa...to_thread.html
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:57.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025