![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Почитав статьи, я что-то до конца не понял, как передавать потокам параметры.
Поток вызывается 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
|
||||
|
||||
![]() Все так-же как и с классами. Создаете 4 экземпляра и у каждого свой набор свойств(параметров) будет. Можно без создания класса обойтись, с помощью процедуры beginthread() тогда в качестве параметра передается указатель на структуру. Тоже создаете 4 указателя и вызываете 4 раза процедуру со своим указателем.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#3
|
|||
|
|||
![]() Спасибо за ответ. Но я с классами что то не особо понял.
Для 4х массивов создавать 4 класса ? А если мне надо 100000 массивов забить random(100) - создавать 100000 классов ? Не могли бы вы написать кусочек, на стандартном примере ниже, буду очень благодарен. type Rnd = class(TThread) protected procedure Execute; override; end; implementation procedure Rnd.Execute; begin RandomizeArray(A); end; |
#4
|
||||
|
||||
![]() Смотрите здесь
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#5
|
||||
|
||||
![]() Для 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
|
|||
|
|||
![]() Спасибо всем кто ответил. Да, так всё работает - как написано в последнем примере.
Отдельное спасибо, что не начал разъяснять о бесполезности 100000 потоков, как на большенстве форумов, а просто написал код. п.с. оказывается, я не один такой. Тут про это в ФАКЬЮ написано. ... К примеру, функция "прослушивает" каталог на предмет файлов. Если находит, то создает нить, которая будет обрабатывать файл. Потомку надо передать имя файла, а вот как? Странный вопрос. Я бы понял, если бы требовалось передавать данные во время работы нити. А так обычно поступают следующим образом. В объект нити, происходящий от TThread дописывают поля. Как правило, в секцию PRIVATE. Затем переопределяют конструктор CREATE, который, принимая необходимые параметры заполняет соответствующие поля. А уже в методе EXECUTE легко можно пользоваться данными, переданными ей при его создании. ... http://www.delphisources.ru/pages/fa...to_thread.html |