Синхронизация потоков (Delphi)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Artist, 16 Jul 2010.

  1. Artist

    Artist Member

    Joined:
    10 Jul 2010
    Messages:
    89
    Likes Received:
    5
    Reputations:
    0
    Я новичок в области потоков!
    Хочу синхронизировать два потока на изменение Caption у формы.
    Code:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Unit2;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
    s : TS;
    s1: TS1;
    begin
    s:= TS.Create(True);
    s.FreeOnTerminate:=True;
    s.Priority:= tpLowest;
    s1 := s1.create(True);
    s1.FreeOnTerminate := true;
    s1.Priority:= tpLowest;
    s.Resume;
    s1.Resume;
    end;
    end.
    Code:
    unit Unit2;
    
    interface
    
    uses
      Classes;
    
    type
      TS = class(TThread)
      private
        { Private declarations }
      protected
      procedure Execute; override;
      end;
    
      TS1 = class(TThread)
      private
        { Private declarations }
      protected
      procedure Execute; override;
      end;
    
    implementation
    
    USES
    Unit1;
     procedure UpdateCaption;
     begin
     Form1.Caption := 'Caption';
     end;
    
    
    { TS }
    
     procedure TS.Execute;
     begin
      Synchronize(UpdateCaption);
     end;
    
     procedure TS1.Execute;
     begin
      Synchronize(UpdateCaption);
     end;
    
    
    end.
    Выдает ошибку.
    [Error] Unit2.pas(37): There is no overloaded version of 'Synchronize' that can be called with these arguments
    [Error] Unit2.pas(42): There is no overloaded version of 'Synchronize' that can be called with these arguments

    Искал в гугле, без результатов(Все одинаковые статьи с фрагментами кода)
    В чем моя проблема?
     
  2. fenixelite

    fenixelite Banned

    Joined:
    7 Feb 2010
    Messages:
    294
    Likes Received:
    56
    Reputations:
    6
    PHP:
    type
      TS 
    = class(TThread)
      private
        { Private 
    declarations } ?????
      protected
      
    procedure Executeoverride;
      
    end;

      
    TS1 = class(TThread)
      private
        { Private 
    declarations } ?????
      protected
      
    procedure Executeoverride;
      
    end;
    А описывать процедуру кто будет?
    В private добавь
     
  3. NemeZz

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

    Joined:
    20 Aug 2008
    Messages:
    102
    Likes Received:
    67
    Reputations:
    3
    procedure UpdateCaption;
    begin
    Form1.Caption := 'Caption';
    end;

    Должна быть оформлена для каждого потока отдельно.Т.е. объявляешь их в интерфейсе:
    Code:
     TS = class(TThread) 
      private 
        { Private declarations }  
     procedure UpdateCaption;
      protected 
      procedure Execute; override; 
      end;
    
    TS1 = class(TThread) 
      private 
        { Private declarations }  
     procedure UpdateCaption;
      protected 
      procedure Execute; override; 
      end;
    
    и юзаешь в коде
    Code:
     procedure TS.UpdateCaption;
     begin
     Form1.Caption := 'Caption';
     end;
    
    procedure TS1.UpdateCaption;
     begin
     Form1.Caption := 'Caption';
     end;
    
    P.S. опередили((
     
  4. fenixelite

    fenixelite Banned

    Joined:
    7 Feb 2010
    Messages:
    294
    Likes Received:
    56
    Reputations:
    6
    NemeZz ;) А { Private declarations } Я бы в твоем примере стер 8)
     
  5. NemeZz

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

    Joined:
    20 Aug 2008
    Messages:
    102
    Likes Received:
    67
    Reputations:
    3
    оно ничем там мешать не будет. Абсолютно.
     
  6. Artist

    Artist Member

    Joined:
    10 Jul 2010
    Messages:
    89
    Likes Received:
    5
    Reputations:
    0

    Как процедуру в private добавить и описать.
    Если можно киньте готовый код, а то не как не могу разобратся.
     
    #6 Artist, 16 Jul 2010
    Last edited: 16 Jul 2010
  7. fenixelite

    fenixelite Banned

    Joined:
    7 Feb 2010
    Messages:
    294
    Likes Received:
    56
    Reputations:
    6
    Artist, дык тебе NemeZz код уже кинул :)
    PHP:
     TS = class(TThread
      private 
        
    procedure UpdateCaption;
     protected 
      .......
    PHP:
        procedure TS.UpdateCaption;
        
    begin
          
    .........
        
    end;
     
    #7 fenixelite, 16 Jul 2010
    Last edited: 16 Jul 2010
  8. fenixelite

    fenixelite Banned

    Joined:
    7 Feb 2010
    Messages:
    294
    Likes Received:
    56
    Reputations:
    6
    Artist, И я бы тебе советовал основы поучить. А потом уже к потокам и прочему переходить.
     
  9. Artist

    Artist Member

    Joined:
    10 Jul 2010
    Messages:
    89
    Likes Received:
    5
    Reputations:
    0
    Все всем спасибо понял, просто процедуру не там писал, ниже protected.
     
  10. AlexTheC0d3r

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

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    у тебя типы потоков отличаются?
     
  11. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Зачем для этого два класса создавать?
    Просто два экземпляра одного класса надо
    Тут ясно написано что ты вызываешь Synchronize c неправильными параметрами
    Смотрим что написано в хэлпе:
    где AMethod это параметр имеющий тип метода класса:
    Ты же, передаешь в него глобальную процедуру:
    Которая к классу не имеет никакого отношения
    Тебе товарищи fenixelite и NemeZz показали как решить.
    Но я считаю это решение временное, тупо вставить и все. Мозгов от этого не прибавится.
    Завтра у тебя появится другой вопрос из похожей области, тебе опять дадут временное решение.
    Так будет продолжаться долго, пока ты не поймешь что ты пополнил ряды говнокодеров
    Потому резюмирую:
    Ты не только в области потоков новичок, но и вообще в программировании.
    В потоки лучше не лезь, пока не прочитаешь пару нормальных книжек, и не научишься отличать методы объектов от глобальных подпрограмм.
     
    1 person likes this.
  12. fenixelite

    fenixelite Banned

    Joined:
    7 Feb 2010
    Messages:
    294
    Likes Received:
    56
    Reputations:
    6
    GhostOnline, Браво професcор. Полностью с тобой согласен.
    P.S Хотел спросить, ты сам программирование выучил до этого уровня, или в Вузе учишься?
     
  13. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Какого уровня? Я в дельфи мягко сказать середнячок.
    А вообще сам. По книгам.
    Но не скрою что в этом году таки поступаю в вуз. Без диплома труднее устроиться.