Исходники Delphi

Добро пожаловать на наш портал

На нашем сайте ежедневно публикуются десятки качественных и свежих материалов, которые Вы можете скачать абсолютно бесплатно. Рекомендуем Вам добавить Наш сайт в закладки, а также подписаться на RSS ленту, чтобы не пропускать интересных новостей.
Стартовая Избранное Главная Контакты Карта сайта

Меню

Не доступно

Не доступно

Опрос

Оцените мой сайт

Проголосовало: 118
Другие опросы

Главная » Файлы » Исходники Delphi » Многопоточные приложения

Пример двухпоточного приложения
[ Скачать с сервера (1.3 Kb) ] 16.02.2013, 20:45
Напишем приложение, которое будет рисовать в своем главном окне отрезки случайного цвета, размера и расположения. При этом главный поток приложения будет ждать событий от пользователя, а рисованием займется второй поток.
Поместите на форму компонент Image и три кнопки Button.
В файле исходного кода Unit1 добавьте в секцию интерфейса объявление TDrawThread, реализующего второй поток. В этот класс добавьте приватные атрибуты для хранения координат концов текущего отрезка и его цвета. Из методов класса TDrawThread нам понадобится реализовать, разумеется, Execute, а также новый метод DrawLine, который будет рисовать отрезок в главном потоке.
Имя объекта потока добавьте в секцию глобальных переменных после объявления переменной Form1 . Осталось обработать событие формы OnCreate и OnDestroy и события OnClick всех кнопок.


Код

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Image1: TImage;
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TDrawThread = class (TThread)
private
X1, X2, Y1, Y2:Integer;
Color:TColor;
protected
procedure Execute; override;
procedure DrawLine;
end;

var
Form1: TForm1;
Thread: TDrawThread;
implementation

{$R *.dfm}
procedure TDrawThread.Execute;
begin
repeat
X1:=Random(Form1.Image1.Width);
Y1:=Random(Form1.Image1.Height);
X2:=Random(Form1.Image1.Width);
Y2:=Random(Form1.Image1.Height);
Color:=TColor(Random($FFFFFF));
Synchronize(DrawLine);
until (Terminated = True);
end;

procedure TDrawThread.DrawLine;
begin
Form1.Image1.Canvas.Pen.Color:= Color;
Form1.Image1.Canvas.MoveTo(X1, Y1);
Form1.Image1.Canvas.LineTo(X2, Y2);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Caption:='Пример работы с потоками';
Button1.Caption:='&Начать';
Button2.Caption:='&Остановить';
Button2.Enabled:=False;
Button3.Caption:='&Готово';
Thread:=TDrawThread.Create(True);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
Thread.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Enabled:=False;
Button2.Enabled:=True;
Thread.Resume;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Thread.Terminate;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Application.Terminate;
end;

end.

При создании окна приложения создается также обьект для второго потока. Он создается в приостановленном состоянии , потому что запускать этот поток мы собираемся нажатием кнопки «Начать». По нажатии этой кнопки мы вызываем метод Resume глобального объекта Thread, который запускает метод Execute во втором потоке.
Рисование отрезков во втором потоке выполняется параллельно с ожиданием действий пользователь в основном потоке, поэтому окно приложения не «зависает»: вы можете перемещать и растягивать окно, а в области рисования продолжится рисование отрезков. Именно поэтому мы сможем рисовать бесконечно, а кнопка «Остановить» все это время будет доступна для нажатия.
Второй поток мы хотим завершить аккуратно, поэтому делаем это «кооперативным» способом: нажатие кнопки «Остановить» посылает второму потоку требования завершиться, присваивая атрибуту Thread.Terminated значение True, а метод Execute второго потока проверяет условие Terminated=True на каждой итерации как условие завершения цикла.
На каждой итерации цикла генерируются координаты и цвет отрезка и вызывается метод DrawLine, выводящий отрезок в область рисования. Область рисования принадлежит визуальному компоненту, поэтому рисующий код нужно выполнить в основном потоке. Мы добиваемся этого, вызывая DrawLine через метод TThread.Synchronize.
Категория: Многопоточные приложения | Добавил: Reif | Теги: Исходники, Потоки, Delphi
Просмотров: 1000 | Загрузок: 144 | Комментарии: 1 | Рейтинг: 0.0/0
Всего комментариев: 0


Название блока

Здесь html код

Название блока

Здесь html код

Название блока

Здесь html код

Название блока

Здесь html код

 
Исходники Delphi
Сделать бесплатный сайт с uCoz |