Конференция "KOL" » создать динамический массив потоков
 
  • tippa (09.01.10 20:58) [0]
    Вообще не знаю как подойти. В VCL делал похожее, но хочу в KOL. Примеров не нашёл.
  • Dy1 (09.01.10 21:46) [1]
    не знаю для чего это нужно... Юзай PList или обычный динамический массив. Не знаю как в VCL :)
  • tippa (09.01.10 22:39) [2]
    Число потоков зависит от вводимых данных, т.е. заранее не известно. В одном случае программа будет работать с 2 потоками, а в другом с 3.
    В VCL так - в отдельном модуле создаем объект потока:
    ...type
     TCountObj = class(TThread)...


    затем в главном модуле типа:
    ...
    var potoki:array of TCountObj;
    ...
    for i:= 0 to num-1 do//num-число потоков
    begin
    potoki[i]:= TCountObj.Create(true);
    potoki[i].Resume;
    potoki[i].Priority:= tpHighest;
    end;
    ...

  • Dy1 (10.01.10 17:05) [3]
    вопрос был "создать динамический массив потоков", я ответил - точно так же. Пишешь array of PThread или юзаешь PList. А то, что ты не знаешь потоки в КОЛ и что такое PList это, извини, совсем другие вопросы. И ответы есть в доке по КОЛ.
  • tippa (28.01.10 21:48) [4]
    var
     Form1 {$IFDEF KOL_MCK} : PForm1 {$ELSE} : TForm1 {$ENDIF} ;
     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?
  • Dy1 (29.01.10 00:02) [5]
    как и все обработчики:
    potok[i].OnExecute := kol.MakeMethod(nil, @funktsia);


    А если метод, то тупо присваиваем (аналогично VCL), возможно с приведением - potok[i].OnExecute := Form1.SvoyMetod;
    Доки читаем, исходники демок смотрим. Пытаемся искать на форуме :)

    Сначала с одним потоком разберись, а если и после этого спросишь что-н аналогичное - обижусь и тогда вообще никто не ответит :)
  • tippa (29.01.10 14:39) [6]
    Спасибо, получилось:
    type
     TPotok=object
     Thread: PThread;
     function ThreadExecute(Sender: PThread): Integer;
    end;
    ...
    var
     Form1 {$IFDEF KOL_MCK} : PForm1 {$ELSE} : TForm1 {$ENDIF} ;
     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);//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;

  • Jon © (29.01.10 17:24) [7]

    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.

  • tippa (01.02.10 13:43) [8]

    > Jon ©   (29.01.10 17:24) [7]

    спасибо за подробный пример
  • Dy1 (07.04.11 15:56) [9]
    появился вопрос по теме.

    Дано: массив потоков.
    Запускаю все, жду через WaitForMultipleObjects...
    Собственно вопрос: если вызвать WaitFor когда уже поток закончил работу (но память не освобождена) - просто получим Result этого потока и всё?
    Мне нужно дождаться когда все потоки отработают и после проверить нет ли ошибок.
  • Vladimir Kladov © (09.04.11 06:07) [10]
    Что означает "нет ли ошибок"?
  • Dy1 (09.04.11 17:11) [11]
    посмотреть Result треда. Использовал GetExitCodeThread. Вопрос снимается, всё равно больше одного сокета работает очень плохо, может опять пров химичит с настройками.
 
Конференция "KOL" » создать динамический массив потоков
Есть новые Нет новых   [120351   +26][b:0][p:0.002]