[Delphi] Многопоточность в программе

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Farcar, 4 Jan 2012.

  1. Farcar

    Farcar Banned

    Joined:
    6 Nov 2011
    Messages:
    55
    Likes Received:
    0
    Reputations:
    0
    Здраствуйте, пишу программу с многопоточностью, когда ее запускаю с одним потоком, все отлично, но если больше выдает ошибку, подскажите где я ошибся.

    Вот код

    PHP:
         TNewThread = class(TThread)
      private
      protected
        
    procedure Executeoverride;
         public
        
    procedure Sync;
        
    constructor Create(CreateSuspendedBoolean);
      
    end;

    .......

    procedure TForm1.Button1Click(SenderTObject);
    begin
      Work
    :=true;
     for 
    Thread:=1  to strtoint(Edit1.Text) do
      
    TNewThread.Create(false);
     
    Thread:=strtoint(Edit1.Text);
    end;

    procedure TNewThread.Execute;
    var
        
    HTTPTIdHTTP;
        
    i,gmesmecifk:integer;
        
    urlurl1res1:string;
    begin
     
    while Work do
      
    begin
       mes
    := form1.memo1.lines.Count;
    mec:=0;
    ifk:=0;
    while 
    mec<>mes do
    begin
    url
    :=form1.memo1.lines[mec];
    res:=form1.idhttp1.get(url);
    res:=Utf8ToAnsi(res);
    res1:=res ;
    g:=pos('<li><span>...</span></li>',res1);
    delete(res1,1,g+25);
    g:=pos('">',res1);
    delete(res1,1,g+1);
    i:=length(res1);
    g:=pos('</a>',res1);
    delete(res1,g,i);
    i:=1;
    while 
    i<>strtoint(res1)+do
    begin
    form1
    .Label1.Caption:='Парсинг....';
    while (
    pos('<div class="h3"><a href="',res)<>0) do
    begin
    delete
    (res,1,pos('<div class="h3"><a href="',res)+25);
    form1.ListBox1.Items.Add(copy(res,1,pos('"',res)-1));
    form1.ListBox1.TopIndex:=form1.ListBox1.Items.Count-1;
    ifk:=ifk+1;
    form1.Label2.Caption:='Спарсено инфы: '+inttostr(ifk);
    end;
    i:=i+1;
    url1:=url+'page'+inttostr(i)+'/';;
    res:=form1.idhttp1.get(url);
    res:=Utf8ToAnsi(res);
    end;
    mec:=mec+1;
    end;
    form1.Label1.Caption:='Готово.';
    form1.Button2.Enabled:=true;
        
    end;
     
    dec(Thread);
     if 
    Thread=0 then ShowMessage('OK');
    end;

    constructor TNewThread.Create(CreateSuspendedBoolean);
    begin
      inherited Create
    (CreateSuspended);
    end;

    При нажатии на бутон выдает такую ошибку:

    [​IMG]


    И выделяет:


    Зарание спасибо.
     
  2. Timon132009

    Timon132009 Member

    Joined:
    7 Jun 2009
    Messages:
    137
    Likes Received:
    19
    Reputations:
    0
    Добавь в поток

    HTTP:=TIdHTTP.Create(nil);

    и замени все idhttp1.get(url); на HTTP.get(url);
     
  3. Farcar

    Farcar Banned

    Joined:
    6 Nov 2011
    Messages:
    55
    Likes Received:
    0
    Reputations:
    0
    Все сделал как написано выше, вроде работает, но через некоторое время выскочила такая ошибка:

    [​IMG]

    и выделяет строку:

     
    #3 Farcar, 4 Jan 2012
    Last edited: 5 Jan 2012
  4. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    отследи на какой строке ошибка вылазит.
    пошагово выполняй программу
    и смотри
     
  5. shadowrun

    shadowrun Banned

    Joined:
    29 Aug 2010
    Messages:
    842
    Likes Received:
    170
    Reputations:
    84
    Бло, линк вводи с http://site.ru
     
  6. cheater_man

    cheater_man Member

    Joined:
    13 Nov 2009
    Messages:
    651
    Likes Received:
    44
    Reputations:
    7
    на будущее:
    используй try, except
     
  7. Farcar

    Farcar Banned

    Joined:
    6 Nov 2011
    Messages:
    55
    Likes Received:
    0
    Reputations:
    0
    программа должна добавить к урл текст: "page", и и цифру, но почемуто цифра не увеличивается, постоянно парсит одну и туже страницу =(
     
  8. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    а... у него "Canvas does not allow Drawing"
    Это попытка рисовать из потока (label.caption, ShowMessage, etc..)
     
  9. Farcar

    Farcar Banned

    Joined:
    6 Nov 2011
    Messages:
    55
    Likes Received:
    0
    Reputations:
    0
    Теперь такая ошибка:

    [​IMG]
     
  10. Farcar

    Farcar Banned

    Joined:
    6 Nov 2011
    Messages:
    55
    Likes Received:
    0
    Reputations:
    0
    Кто нибудь мне подскажет в чем проблема???
     
  11. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    картинку перезалей, ее не видно!
     
  12. NekitoSP

    NekitoSP New Member

    Joined:
    14 May 2010
    Messages:
    17
    Likes Received:
    0
    Reputations:
    0
    проблема с синхронизацией у тебя, инфа 99%, вполне возможно, что N разных потоков в один момент обращаются к одним общим объектам, как например:
    почитайте про TCriticalSection
     
    #12 NekitoSP, 5 Jan 2012
    Last edited: 5 Jan 2012
  13. Farcar

    Farcar Banned

    Joined:
    6 Nov 2011
    Messages:
    55
    Likes Received:
    0
    Reputations:
    0
    Как просили, перезалил картинку:

    [​IMG]
     
  14. ADR-007

    ADR-007 Member

    Joined:
    12 Jul 2010
    Messages:
    218
    Likes Received:
    9
    Reputations:
    0
    при використанні потоків забудь про компоненти на формі! якщо тобі щось потрібно то зроби копію цього ’чогось’ для кожного потоку
     
    #14 ADR-007, 6 Jan 2012
    Last edited: 6 Jan 2012
    1 person likes this.
  15. Farcar

    Farcar Banned

    Joined:
    6 Nov 2011
    Messages:
    55
    Likes Received:
    0
    Reputations:
    0
    можно пожалуйста пример
     
  16. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    гугл => динамическое создание объектов Delphi
     
  17. shadowrun

    shadowrun Banned

    Joined:
    29 Aug 2010
    Messages:
    842
    Likes Received:
    170
    Reputations:
    84
    Синхронайз, не?
     
    1 person likes this.
  18. ADR-007

    ADR-007 Member

    Joined:
    12 Jul 2010
    Messages:
    218
    Likes Received:
    9
    Reputations:
    0
    як коли... якщо читати треба часто і критична швидкість виконання то він не підходить...
     
  19. ADR-007

    ADR-007 Member

    Joined:
    12 Jul 2010
    Messages:
    218
    Likes Received:
    9
    Reputations:
    0
    Code:
    TNewThread = class (TThread)
    private
      FParam1,FParam2:integer;
    protected
      procedure Execute; override;
    public
      constructor Create(Param1,Param2:integer);
      
      property Param1:integer read FParam1 write FParam1;
      property Param2:integer read FParam2 write FParam2;
    end;
    
    constructor TNewThread.Create(Param1,Pararm2:integer);
    begin
      inherited Create(False);
      FParam1:=Param1;
      FParam2:=Param2;
      FreeOnTerminate:=true;
    end;
    
    
    procedure TNewThread.Execute; override;
    var
      MyObject:TMyObject;
    begin
      MyObject:=TMyObject.Create;
      try
        MyObject.MyMethod(FParam1);
      finaly
        MyObject.Free;
      end;
    end;
    
    
    
    begin
      TNewThread.Create(1,2);
      //або
      with TNewThread.Create(True) do
      begin
        Param1:=1;
        Param2:=2;
        FreeOnTerminate:=true;
      end;
    end;
      
    
     
  20. ADR-007

    ADR-007 Member

    Joined:
    12 Jul 2010
    Messages:
    218
    Likes Received:
    9
    Reputations:
    0
    ну я би то інакше робив... але можна так (Delphi 2009+)
    Code:
    Synhronize(procedure begin  mes:= form1.memo1.lines.Count end);
    старайся зробити потік як можна більш автономним... (якщо можна то зроби так - ти йому вхідні дані, а він тобі вихідні)
     
    #20 ADR-007, 6 Jan 2012
    Last edited: 6 Jan 2012
Loading...
Similar Threads - Delphi Многопоточность программе
  1. Peja
    Replies:
    0
    Views:
    2,676