Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.04.2008, 15:14   #1
amandra
Пользователь
 
Регистрация: 12.10.2007
Сообщений: 19
По умолчанию использование TThread

как сделать так, чтобы поток один раз создавался, и по команде запускался и останавливался когда это надо?
amandra вне форума Ответить с цитированием
Старый 25.04.2008, 15:58   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Точнее сформулируйте что должно происходить. Слишком много разных схем синхронизации можно изобрести. И "останавливался" значит "завершался" или "приостанавливался"?
B_N вне форума Ответить с цитированием
Старый 25.04.2008, 19:52   #3
Никки
Форумчанин Подтвердите свой е-майл
 
Аватар для Никки
 
Регистрация: 20.11.2007
Сообщений: 500
По умолчанию

вот тут есть про потоки много и с примером! я тут прочитал и всё что хотел сделал! Может и тебе подойдет:
http://nikki.am9.ru/programming/lang...ter%2014/1.htm
Никки вне форума Ответить с цитированием
Старый 02.05.2008, 19:20   #4
amandra
Пользователь
 
Регистрация: 12.10.2007
Сообщений: 19
По умолчанию

смысл таков: чтобы поток запускался и приостанавливал (не завершался) свою работу, после некоторой паузы снова запускался
amandra вне форума Ответить с цитированием
Старый 02.05.2008, 20:56   #5
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Врятли такое возможно. И вообще такие проблемы решаются другим рациональным способом. Делается класс с вашими данными и private переменной вашего потока. Ну и в классе пишите запуск и паузу потока, но конечно же вы понимаите что после паузы поток Free а при старте Create
BOBAH13 вне форума Ответить с цитированием
Старый 02.05.2008, 23:07   #6
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от amandra Посмотреть сообщение
смысл таков: чтобы поток запускался и приостанавливал (не завершался) свою работу, после некоторой паузы снова запускался
Один и тот же поток (как объект ОС, а не как функция) создаётся и уничтожается один раз. В следующий раз это будет новый поток. Но каждый поток можно приостанавливать и возобновлять. Формулировка Ваша туманна, как и прежде, но если поможет, могу предложить очень простенький пример:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Controls, Forms,
  ComCtrls, StdCtrls, SyncObjs, ExtCtrls;

type
  TCounterThread = class(TThread)
  private
    EditCtrl    : TWinControl;
    ProgressBar : TWinControl;
  protected
    counter     : cardinal;
    procedure UpdateDisplay;
  public
    constructor Create(CreateSuspended: Boolean; Edit, ProgressBar : TWinControl);
  end;

type
  TThread1 =  class(TCounterThread)
  protected
    procedure Execute; override;
  end;

  TThread2 = class(TCounterThread)
  protected
    procedure Execute; override;
  end;

  TThread3 = class(TCounterThread)
  private
    SyncEvent : TEvent;
  protected
    procedure Execute; override;
  public
    constructor Create(CreateSuspended: Boolean; hEdit, hProgressBar : TWinControl; Sync : TEvent);
  end;

  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Edit1: TEdit;
    GroupBox2: TGroupBox;
    Edit2: TEdit;
    GroupBox3: TGroupBox;
    StartButton: TButton;
    Edit3: TEdit;
    Timer1: TTimer;
    ProgressBar1: TProgressBar;
    ProgressBar2: TProgressBar;
    ProgressBar3: TProgressBar;
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure StartButtonClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    WorkerThreads       : array [1 .. 3] of TCounterThread;
  public
    Th3_Sync_Event      : TEvent;
    TerminateExecution  : boolean;
  end;

var
  Form1: TForm1;

implementation
{$R *.dfm}

constructor TCounterThread.Create(CreateSuspended: Boolean; Edit, ProgressBar : TWinControl);
begin
    inherited Create(CreateSuspended);
    Self.counter := 0;
    Self.EditCtrl := Edit;
    Self.ProgressBar := ProgressBar;
end;

procedure TCounterThread.UpdateDisplay;
begin
    (Self.EditCtrl as TEdit).Text := IntToStr(self.counter);
    (Self.ProgressBar as TProgressBar).StepIt;
end;

procedure TThread1.Execute;
var
    i : integer;
begin
    repeat
        for i := 1 to 10 do begin
            inc(Self.counter);
            Synchronize(UpdateDisplay);
            Sleep(100);
        end;
        Sleep(2000);
    until Form1.TerminateExecution;
end;

procedure TThread2.Execute;
begin
    repeat
        inc(Self.counter);
        Synchronize(UpdateDisplay);
        Sleep(100);
    until Form1.TerminateExecution;
end;

constructor TThread3.Create(CreateSuspended: Boolean; hEdit, hProgressBar : TWinControl; Sync : TEvent);
begin
    inherited Create(CreateSuspended, hEdit, hProgressBar);
    Self.SyncEvent := Sync;
end;

procedure TThread3.Execute;
var
    i : integer;
begin
    repeat
        if wrSignaled = Self.SyncEvent.WaitFor(250) then begin
            for i := 1 to 10 do begin
                inc(Self.counter);
                Synchronize(UpdateDisplay);
                Sleep(100);
            end;
        end;
    until Form1.TerminateExecution;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
    if not self.WorkerThreads[2].Terminated then begin
        if self.WorkerThreads[2].Suspended
        then self.WorkerThreads[2].Resume
        else self.WorkerThreads[2].Suspend;
    end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
    self.TerminateExecution := false;
    self.Th3_Sync_Event     := TEvent.Create(nil, FALSE, FALSE, '');

    self.WorkerThreads [1]  := TThread1.Create(true, Edit1, ProgressBar1);
    self.WorkerThreads [2]  := TThread2.Create(true, Edit2, ProgressBar2);
    self.WorkerThreads [3]  := TThread3.Create(true, Edit3, ProgressBar3, self.Th3_Sync_Event);

    self.WorkerThreads [1].Resume;
    self.WorkerThreads [3].Resume;

    self.Timer1.Interval    := 2000;
end;

procedure TForm1.StartButtonClick(Sender: TObject);
begin
    self.Th3_Sync_Event.SetEvent;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
    self.Timer1.Enabled := false;

    if  not self.WorkerThreads [2].Terminated
        and self.WorkerThreads [2].Suspended
    then self.WorkerThreads [2].Resume;

    self.WorkerThreads [1].WaitFor;
    self.WorkerThreads [2].WaitFor;
    self.WorkerThreads [3].WaitFor;

    MessageBox(Form1.Handle, 'Ok', 'Ok', MB_OK or MB_ICONINFORMATION);

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    self.TerminateExecution := true;
end;

end.
Вложения
Тип файла: rar Sync.rar (172.7 Кб, 19 просмотров)
B_N вне форума Ответить с цитированием
Старый 03.05.2008, 03:13   #7
Jupiter
Пользователь Подтвердите свой е-майл
 
Регистрация: 26.03.2008
Сообщений: 42
По умолчанию

можно использовать WaitForSingleObject

Int1 будет увеличиваться
на единицу, после чего поток будет останавливаться,
и запускаться через 5 сек.

Код:
.................
Var 
 Thread1 : TMThread;

implementation


procedure TMThread.Execute;
Var
i : Integer;
Int1 : Integer;

begin
Int1 := 0;

  For i := 0 To 8000 Do
  begin
  Int1 := Int1 + 1;
  WaitForSingleObject(Thread1,5000);
  end;

end;

Последний раз редактировалось Jupiter; 03.05.2008 в 03:15. Причина: Исправление
Jupiter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование *.swf Романнн Мультимедиа в Delphi 14 02.04.2010 09:27
Метод Synchronize класса TThread EdNovice Общие вопросы Delphi 10 01.08.2009 14:47
Stack owerflow - глюки с TThread IOrist Общие вопросы Delphi 4 11.11.2007 09:13
Как отследить завершение выполнения потока TThread? Трик Общие вопросы Delphi 3 24.10.2007 14:55
Использование длл Anatolij Win Api 1 02.01.2007 19:54