[Delphi]. Вопрос по потокам.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by f0rward, 23 May 2009.

  1. f0rward

    f0rward New Member

    Joined:
    26 Oct 2008
    Messages:
    10
    Likes Received:
    2
    Reputations:
    0
    Хочу заменить в программе класс TThread на стандартные фунции BeginThread и EndThread. Вот так кусок кода выглядел на TThread :
    Code:
    ...
     for i:=1 to thr do begin
        for j:=0 to source.Count -1 do begin
          a[i]:=TNewThread.Create(true);
          a[i].FreeOnTerminate:=true;
          a[i].Priority:=tpLOWEst;
          a[i].LoginTH:=copyLogin(Source.Strings[j]);
          a[i].passTH:=copyPass(Source.Strings[j]);
          a[i].Resume;
          application.ProcessMessages;
          if Application.Terminated then break;
          if stop then begin
             ...
          end;
        end;
        ...
     end;
    
    Пробовал различными способами, никак.
    Если один поток, то это будет выглядеть так :
    Code:
    ...
    type
      PInfo=TInfo
      TInfo=record
        login, pass: string;
      end;
    ...
    
    function xz(info:PInfo);
    begin
      try
        ...
      finally
        Dispose(Info);
    end;
    
    procedure execute;
    var
       Info: PInfo;
       hThread: integer;
       Dummy: DWORD:
    begin
      New(Info);
      Info.Login:='login';
      Info.Pass:='pass';
      hThread:=BeginThread(nil, 0, @xz,  Info,  0, Dummy);
      ...
    end;
    
    И всё работает отлично. Но как организовать работу в несколько потоков, незнаю.
     
  2. t04

    t04 Elder - Старейшина

    Joined:
    10 Jan 2007
    Messages:
    137
    Likes Received:
    40
    Reputations:
    8
    дык думать то надо
    надо организовать массив

    делай так
    Code:
    
    function xz(info:PInfo);
    begin
      try
        ...
      finally
        Dispose(Info);
        ExitThread(0);
      END; //!!!!!!!!!!
    end;
    
    var
      Info: PInfo;
      thID,i : DWORD;
      Threads : Array [1..n] of DWORD;
    begin
      for i := 1 to n do
        begin
          New(Info);
          Info.Login:='login';
          Info.Pass:='pass';
          Threads[i] := CreateThread(nil, 0, @xz,  Info,  0, thID);
        end;
    end;
    
    а вообще если для себя пишешь то можно не влезать в этот гемор, а пользоваться уже готовыми классами, если ты конечно не извращенец который ради того чтобы убрать из кода лишнюю переменную извратить код по самое не могу.
     
  3. f0rward

    f0rward New Member

    Joined:
    26 Oct 2008
    Messages:
    10
    Likes Received:
    2
    Reputations:
    0
    Спасибо, про ошибки в коде сори, на коленке писал.
    И там ещё должна быть не ф-я xz, а процедура).
    Ты про TThread? Гумно это, хоть там и всё проще гораздо.
    Теперь нужно организовать двойной цикл типа :
    Code:
    for i:=1 to thr do begin
        for j:=0 to source.Count -1 do begin
    
    При TThread это легко, а c beginthread что-то никак. Напиши, пожалуйста,, если знаешь, как.