Delphi, потоки(Кто бы мог подумать?)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by SamaRazor, 28 Mar 2012.

  1. SamaRazor

    SamaRazor New Member

    Joined:
    2 Feb 2012
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Научился создавать класс потока, екзекутить его. Но у меня появляется нескромный вопрос - есть функция, принимающая какие-либо параметры. Мне нужно запустить n потоков, в которых будут работать n функций. Вроде бы все просто, но я не могу понять, как запустить эти потоки, чтобы в каждом была функция с разными параметрами. Поможет кто? Большое спасибо.
     
  2. SamaRazor

    SamaRazor New Member

    Joined:
    2 Feb 2012
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Ах да - работаю таким образом.

    potok = class(TThread) // Обьявление класса.
    private
    { Private declarations }
    protected
    procedure Execute; override;
    end;

    var
    Thread1: Tpotok; // Переменная нашего типа.

    procedure Tpotok.Execute; // Собственно сам поток.
    begin
    while True do begin
    work(Параметр,true);
    sleep(3000);
    end;
    end;
     
  3. Tip.the.besT

    Tip.the.besT Member

    Joined:
    24 Jun 2009
    Messages:
    267
    Likes Received:
    10
    Reputations:
    4
    Code:
    uses   SyncObjs;
    
    
    potok = class(TThread)
      private
       s : string;///////////это переменные которые можно 
       ss : string;///////////использовать при передачи данных 
       rez : Integer;///////внутри потока
      protected
        procedure Execute; override;
      public
        procedure Sync;   //////////это процедуры которые 
     /////////////////ты можешь вызывать из потока
        constructor Create(CreateSuspended: Boolean);///это 
    ///////конструктор ты здесь лучше ничего пока не меняй. 
      end;
    
    var
    CS:TcriticalSection;///на всякий случай объявляем критические 
    ///секции
    
    constructor potok.Create(CreateSuspended: Boolean);
    begin
      inherited Create(CreateSuspended);///непосредственно 
    end;///////процедура конструктора
    implementation
    
    procedure TForm1.Button2Click(Sender: TObject);
    begin
    for potok:=1  to 5 do ///здесь непосредственно создаём потоки
      potok.Create(false);///сколько тебе нужно
    end;
    
    procedure potok.Execute;//процедура выполняемая после создания потока
    var 
    begin
    end;
    
    procedure potok.Sync; ///дополнительная процедура потока
    begin//которую ты можеш вызывать из потока, например,
    end;///для работы с графическими элементами
    end;////в главном потоке.
    //не стоит забывать о том, что работа с графическими 
    //элементами и объектами в главном потоке, осуществляется 
    //только через synchronize. пример: synchronize(Sync);
    
    
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
     CS:=TcriticalSection.create;///создание критических секций
    end;
    
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
     CS.Free;//всё, что создали ручками не забываем удалить
    end;
    
    end.
    
    Ну как - то так. вроде расписал. Если что пиши в асю, помогу.
     
  4. SamaRazor

    SamaRazor New Member

    Joined:
    2 Feb 2012
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Спасибо большое. Я просто до этого не дошел, как читать начал сразу понял соль :)