-
Вообще не знаю как подойти. В VCL делал похожее, но хочу в KOL. Примеров не нашёл.
-
не знаю для чего это нужно... Юзай PList или обычный динамический массив. Не знаю как в VCL :)
-
Число потоков зависит от вводимых данных, т.е. заранее не известно. В одном случае программа будет работать с 2 потоками, а в другом с 3. В VCL так - в отдельном модуле создаем объект потока: ...type
TCountObj = class(TThread)... затем в главном модуле типа: ...
var potoki:array of TCountObj;
...
for i:= 0 to num-1 do begin
potoki[i]:= TCountObj.Create(true);
potoki[i].Resume;
potoki[i].Priority:= tpHighest;
end;
...
-
вопрос был "создать динамический массив потоков", я ответил - точно так же. Пишешь array of PThread или юзаешь PList. А то, что ты не знаешь потоки в КОЛ и что такое PList это, извини, совсем другие вопросы. И ответы есть в доке по КОЛ.
-
var
Form1 : PForm1 : TForm1 ;
potok:array of PThread; ...
procedure TForm1.Button1Click(Sender: PObj);
var i:integer;
begin
for i:=0 to 10 do
begin
potok[i]:=NewThread;
potok[i].Resume;
end;
end; А как объявить обработчик OnExecute?
-
как и все обработчики: potok[i].OnExecute := kol.MakeMethod(nil, @funktsia); А если метод, то тупо присваиваем (аналогично VCL), возможно с приведением - potok[i].OnExecute := Form1.SvoyMetod; Доки читаем, исходники демок смотрим. Пытаемся искать на форуме :) Сначала с одним потоком разберись, а если и после этого спросишь что-н аналогичное - обижусь и тогда вообще никто не ответит :)
-
Спасибо, получилось: type
TPotok=object
Thread: PThread;
function ThreadExecute(Sender: PThread): Integer;
end;
...
var
Form1 : PForm1 : TForm1 ;
Potok:array of TPotok;
...
function TPotok.ThreadExecute(Sender: PThread): Integer;
begin
Result := 0;
end;
procedure TForm1.Button1Click(Sender: PObj);
var i:integer;
begin
SetLength(Potok,n); for i:=0 to n-1 do
begin
Potok[i].Thread:=newthread;
Potok[i].Thread.OnExecute:=Potok[i].ThreadExecute;
Potok[i].Thread.Resume;
end;
end;
-
program Test;
uses
KOL;
type
PForm1 = ^TForm1;
TForm1 = object(TObj)
Form, Button: PControl;
Thread: array of PThread;
public
procedure ButtonClick(Sender: PObj);
function ThreadExecute(Sender: PThread): Integer;
end;
var
Form1: PForm1;
procedure NewForm1(var Result: PForm1; AParent: PControl);
begin
New(Result,Create);
with Result^ do
begin
Form := NewForm(AParent,'Form1').SetSize(320,240);
Button := NewButton(Form,'Go').CenterOnParent;
Button.OnClick := ButtonClick;
end;
end;
procedure TForm1.ButtonClick(Sender: PObj);
var
i:integer;
begin
SetLength(Thread,10);
for i:= 0 to Length(Thread) -1 do
begin
Thread[i] := NewThread;
Thread[i].OnExecute := ThreadExecute;
Thread[i].Resume;
end;
end;
function TForm1.ThreadExecute(Sender: PThread): Integer;
begin
Result := 0;
end;
begin
Applet := NewApplet('Test');
NewForm1(Form1,Applet);
Run(Applet);
end.
-
> Jon © (29.01.10 17:24) [7]
спасибо за подробный пример
-
появился вопрос по теме.
Дано: массив потоков. Запускаю все, жду через WaitForMultipleObjects... Собственно вопрос: если вызвать WaitFor когда уже поток закончил работу (но память не освобождена) - просто получим Result этого потока и всё? Мне нужно дождаться когда все потоки отработают и после проверить нет ли ошибок.
-
Что означает "нет ли ошибок"?
-
посмотреть Result треда. Использовал GetExitCodeThread. Вопрос снимается, всё равно больше одного сокета работает очень плохо, может опять пров химичит с настройками.
|