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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2012, 23:09   #1
zokwild
Пользователь
 
Регистрация: 17.11.2011
Сообщений: 11
По умолчанию Многопоточное приложение в Делфи

Создается многопоточное приложение, в котором демонстрируется образование и приостановка трех потоков, изменение их приоритетов и уничтожение (освобождение ресурсов)
Подскажите пожалуйста как завершить потоки в цикле с помощью метода Terminate?
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, ComCtrls, StdCtrls, Unit2;

type
  TForm1 = class(TForm)
    pb1: TPaintBox;
    pb2: TPaintBox;
    pb3: TPaintBox;
    TrackBar1: TTrackBar;
    TrackBar2: TTrackBar;
    TrackBar3: TTrackBar;
    btn1: TButton;
    btn2: TButton;
    btn3: TButton;
    btn4: TButton;
    btn5: TButton;
    btn6: TButton;
    btn7: TButton;
    procedure FormCreate(Sender: TObject);
    procedure btn4Click(Sender: TObject);
    procedure btn5Click(Sender: TObject);
    procedure btn6Click(Sender: TObject);
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
    procedure btn3Click(Sender: TObject);
    procedure TrackBar1Change(Sender: TObject);
    procedure btn7Click(Sender: TObject);
    private
    taxi00:tbitmap;
    taxi01:TBitmap;
    public
    Destructor  Destroy; override;
  end;

var
  Form1: TForm1;
  thread1:TMoveThread;
  thread2:TMoveThread;
  thread3:TMoveThread;
  I:Integer;
  priority:TThreadPriority;
implementation


{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
begin
taxi00:=tbitmap.Create; // Создается объект BitMap
taxi00.LoadFromFile('taxi00.bmp'); //В него загружается изображение
taxi01:=tbitmap.Create;
taxi01.LoadFromFile('taxi01.bmp');
thread1:= TMoveThread.Create(taxi00,taxi01,pb1); //Создается поток
Thread1.Priority:=tpLowest; // Устанавливается небольшой приоритет у потока; это необходимо для того, чтобы поток был управляемым и не забирал все ресурсы.
thread2:= TMoveThread.Create(taxi00,taxi01,pb2); //Создается поток
Thread2.Priority:=tpLowest;
thread3:= TMoveThread.Create(taxi00,taxi01,pb3); //Создается поток
Thread3.Priority:=tpLowest;
Thread1.Suspend;
Thread2.Suspend;
Thread3.Suspend;
end;
procedure TForm1.btn4Click(Sender: TObject);
begin
if Thread1.Suspended=false then Thread1.Suspend;
end;

procedure TForm1.btn5Click(Sender: TObject);
begin
if Thread2.Suspended=false then Thread2.Suspend;
end;
procedure TForm1.btn6Click(Sender: TObject);
begin
if Thread3.Suspended=false then Thread3.Suspend;
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
if Thread1.Suspended=true then Thread1.Resume;
end;

procedure TForm1.btn2Click(Sender: TObject);
begin
if Thread2.Suspended=true then Thread2.Resume;
end;

procedure TForm1.btn3Click(Sender: TObject);
begin
if Thread3.Suspended=true then Thread3.Resume;
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
begin
priority:=tpIdle;
for i:=0 to ((sender as ttrackbar).position -1) do inc(priority);
if sender=trackbar1 then thread1.priority:=priority
else
if sender=trackbar3 then thread3.priority:=priority
else thread2.Priority:=priority;
end;
end;
destructor TForm1.Destroy;
begin
Taxi00.free;
Taxi01.free;
inherited Destroy;
end;
procedure TForm1.btn7Click(Sender: TObject);
begin
Form1.Close;
end;
end.
Код:
unit Unit2;

interface

uses
  Classes, Graphics, ExtCtrls,  SysUtils;

type
  TMoveThread = class(TThread)
 private
FBox: TPaintBox; // Где воспроизводится картинка
b0,b1: tbitmap; // Сами картинки
i:integer; // Для определения координат картинки
procedure DoVisualSwap; // Одна процедура двигает вправо,
procedure DoVisual; // Другая влево
protected
procedure Execute; override;
public
 Thread1,
 Thread2,
 Thread3:TMoveThread;
constructor Create(a,b: TBitmap; c:TPaintBox);
destructor Destroy; override;
end;

implementation
 constructor TMoveThread.Create(a,b:tbitmap; c:TPaintBox);
begin
b0:=a;b1:=b;Fbox:=c;i:=0;
inherited Create(False);
end;

destructor TMoveThread.Destroy;
begin
b0.free;
b1.free;
inherited Destroy;
end;

procedure TMoveThread.Execute;
begin
  begin
while true do
begin
while i<=(fbox.Width+b0.Width) do Synchronize(DoVisualSwap);
while i>=(0-b0.Width) do Synchronize(DoVisual);
end;
end;
end;
procedure TMoveThread.DoVisualSwap; { Двигает картинку вправо } 
begin
with FBox do
begin
canvas.Draw(i,0,b0);
inc(i);
end;
Sleep(2);
end;

procedure TMoveThread.DoVisual; { Двигает картинку влево }
begin
with FBox do
begin
canvas.Draw(i,0,b1);
dec(i);
end;
Sleep(2);
end;
end.

Последний раз редактировалось Stilet; 22.05.2012 в 07:57.
zokwild вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многопоточное приложение в Делфи zokwild Помощь студентам 0 02.05.2012 21:55
многопоточное приложение Vistar Общие вопросы .NET 1 26.08.2011 16:25
многопоточное приложение favorite Общие вопросы Delphi 0 26.05.2011 19:47
Многопоточное приложение MaXoN66613 Помощь студентам 0 07.06.2010 12:36
Многопоточное приложение на Indy Core2Duo Работа с сетью в Delphi 15 08.04.2009 16:45