потоки и indy [delphi]

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by 1n0y, 23 Apr 2010.

  1. 1n0y

    1n0y Active Member

    Joined:
    9 May 2009
    Messages:
    272
    Likes Received:
    276
    Reputations:
    2
    допустим есть код:

    Code:
    procedure tnew.getln;
    var
     t:tstringlist;
     i:integer;
    begin
     for i:=0 to form1.memo1.lines.count-1 do
     begin 
      t:=stringlist.create;
      t.text:=form1.idhttp1.get(form1.memo1.lines[i]);
      form1.memo2.lines.add(t.text);
     end;
    end;
    как сделать, чтобы, скажем, потоков 20 паралельно его выполняли?

    пытался примерно вот так:

    Code:
    tnew = class(tthread)
     private
      procedure getln;
     protected
     procedure execute; override;
    end;
    
    var
     form1: tform1;
     new1, new2: tnew;
     i:integer;
    
    procedure tform1.button1click(sender: tobject);
    begin
     new1 := tnew.create(true);
     new1.freeonterminate := true;
     new1.s := '1 thread';
     new1.priority := tpnormal;
     new2 := tnew.create(true);
     new2.freeonterminate := true;
     new2.s := '2 thread';
     new2.priority := tpnormal;
     new1.resume;
     new2.resume;
    end;
    
    
    
    procedure tnew.getln;
    var
     t:tstringlist;
     i:integer;
    begin
     for i:=0 to form1.memo1.lines.count-1 do
     begin 
      t:=stringlist.create;
      t.text:=form1.idhttp1.get(form1.memo1.lines[i]);
      form1.memo2.lines.add(t.text);
     end;
    end;
    
    procedure tnew.execute;
    begin
     getln;
    end;
    но idhttp1 вылетает с ошибкой или виснет (непомню точно, влом делфи включать) :(
    краем уха слышал про idthreadcomponent, но адекватных примеров его использования я не нашел..
    помогите!!!!11
     
    1 person likes this.
  2. ange007

    ange007 Member

    Joined:
    26 Aug 2009
    Messages:
    28
    Likes Received:
    21
    Reputations:
    0
    Создавай все компоненты в Execute перед выполнением работы а не в процедурах.
    И уничтожай потом в Destroy или где там у тебя завершение.
    И делай синхронизацию потоков с формой.
    Ты можешь в литровую банку сразу 5 рук засунуть?

    З.Ы. И что у тебя за бред с созданием TStringList?
    Он у тебя создаётся по сто раз и ни разу не уничтожается!
     
  3. Meecript_

    Meecript_ Banned

    Joined:
    29 Oct 2008
    Messages:
    194
    Likes Received:
    62
    Reputations:
    32
    1) Synchronize
    2) объект TIdHTTP сделай локальным для потока

    Если руки кривые, обычно так и делают =)
     
    1 person likes this.
  4. 1n0y

    1n0y Active Member

    Joined:
    9 May 2009
    Messages:
    272
    Likes Received:
    276
    Reputations:
    2
    спасибо, учту.

    ды это примерный код, я его тут и придумал :) главное - айдихттп



    2) пример можно? :)
     
    #4 1n0y, 23 Apr 2010
    Last edited: 23 Apr 2010
  5. ange007

    ange007 Member

    Joined:
    26 Aug 2009
    Messages:
    28
    Likes Received:
    21
    Reputations:
    0
    Code:
    tnew = class(tthread)  
    private   
    idHTTP:TIdHTTP;
    procedure getln;  
    protected  
    procedure execute; override; 
    end;
     
  6. cheater_man

    cheater_man Member

    Joined:
    13 Nov 2009
    Messages:
    651
    Likes Received:
    44
    Reputations:
    7
    один из простых вариантов юзать MPI :)
     
  7. 1n0y

    1n0y Active Member

    Joined:
    9 May 2009
    Messages:
    272
    Likes Received:
    276
    Reputations:
    2
    блин, пример как создавать :)
    в tform1.button1click добавить это?

    new1.idHTTP=idhttp.create; (или как там правильно создавать?)
    new2.idHTTP=idhttp.create;
    newN.idHTTP=idhttp.create;
     
  8. 1n0y

    1n0y Active Member

    Joined:
    9 May 2009
    Messages:
    272
    Likes Received:
    276
    Reputations:
    2
    "Существуют реализации для языков Фортран 77/90, Си и Си++." :mad:
     
  9. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    IdHttp надо создавать в конструкторе класса потока..и уничтожать в деструкторе (хотя так и не обязательно, у меня например idhttp и потоки существуют независимо друг от друга, у меня что-то вроде многопоточной очереди)
    ТС я тебе советую сначала почитать про классы, научится их писать самому, иначе тебе придется ой как трудно в создании мультитредных сетевых аппликаций
     
    #9 GhostOnline, 23 Apr 2010
    Last edited: 23 Apr 2010
  10. _nic

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

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    С сокетами легче синхронизировать ;)
     
  11. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    За базар ответишь? :D Разница-то какая?
     
  12. Sunstrider

    Sunstrider Banned

    Joined:
    9 Apr 2010
    Messages:
    152
    Likes Received:
    10
    Reputations:
    4
    IDhttp легче в изучение
     
    1 person likes this.
  13. Meecript_

    Meecript_ Banned

    Joined:
    29 Oct 2008
    Messages:
    194
    Likes Received:
    62
    Reputations:
    32
    Возможных способов синхронизации потоков не так много и ни в одном из них нет особых сложностей.
     
  14. _nic

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

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Можно даже ничего не синхронизировать.А если надо упорядочить доступ к каким то общим данным то крит.секций будет вполне достаточно.
    за то rfc знать не будешь :D
     
  15. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    А крит секции это не синхронизация?
    Низачод, сморозил чушь, а теперь чтобы оправдаться вообще загнался
    Что-то мне сдается что юный фанатик дельфей старше тебя
     
    #15 GhostOnline, 23 Apr 2010
    Last edited: 23 Apr 2010
  16. _nic

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

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Читать научись.Потом внимательно ещё раз прочти.Юный фанатик делфей.
     
  17. 1n0y

    1n0y Active Member

    Joined:
    9 May 2009
    Messages:
    272
    Likes Received:
    276
    Reputations:
    2
    создаю

    Code:
    tnew = class(tthread)
     private
      http:TIdHTTP;
      cook:tidcookiemanager;
     protected
     procedure execute; override;end;
    
    
    procedure tnew.execute;
    begin
     http:=form1.idhttp1.Create;
     http.HandleRedirects:=true;
     cook:=form1.idcookiemanager1.Create(http);
     http.CookieManager:=cook;
    <..>
    end;
    
    первый поток грузится, после выдаёт "a component named idcookiemanager1 already exist"
    wft? что я делаю не так?
     
  18. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    cook := TIdCookieManager.Create(nil);

    И мля, нах не надо его вообще создавать то
    просто http.AllowCookies := True; и все

    Ты все делаешь не так
    form1.idcookiemanager1.Create(http);
    что это за конструкотр такой? ты пытаешься создать объект другим компонентом?
     
    #18 GhostOnline, 24 Apr 2010
    Last edited: 24 Apr 2010
    1 person likes this.
  19. 1n0y

    1n0y Active Member

    Joined:
    9 May 2009
    Messages:
    272
    Likes Received:
    276
    Reputations:
    2
    не ругайся (:)
    хз, с какого-то примера скопипастил. ща папрбую как ты сказал.
     
  20. ange007

    ange007 Member

    Joined:
    26 Aug 2009
    Messages:
    28
    Likes Received:
    21
    Reputations:
    0
    1n0y, нельзя в потоке просто так использовать компоненты с формы.
    Создавай компоненты конкретно в самом потоке!

    Вот что-то тип такого:
    Code:
     TMyThread = class(TThread)
    
     private
        FCS: RTL_CRITICAL_SECTION;
    
        FH TidHTTP;
        FS: TIdIOHandlerStack;
        CM: TIdCookieManager;
    ...
     protected
        procedure Execute; override;
    ...
     public
        constructor Create;
        destructor Destroy; override;
    ....
    ....
    procedure TMyThread.Execute;
    var text:string;
    begin
      {}
      FH := TidHTTP.Create;
      FS := TIdIOHandlerStack.Create;
      CM := TidCookieManager.Create;
      {--//--}
      FH.IOHandler := FS; 
      FH.HandleRedirects := true;
      FH.CookieManager := CM;
      FH.AllowCookies := true;
    ...
    text := FH.Get('');
    ...
    end;
    
    constructor TMyThread.Create;
    begin
      inherited Create(True);
    ...
      FreeOnTerminate := False;
      InitializeCriticalSection(FCS);
      Resume;
    end;
    
    destructor TMyThread.Destroy;
    begin
      FreeAndNil(FH);
      FreeAndNil(FS);
      FreeAndNil(CM);
      DeleteCriticalSection(FCS);
    end;
    
     
    #20 ange007, 24 Apr 2010
    Last edited: 24 Apr 2010
    1 person likes this.