Разработка многопоточных Windows-приложений в среде Borland C Builder
СОДЕРЖАНИЕ: МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ УКРАИНЫ ДОНЕЦКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ Кафедра АСУ Отчёт к индивидуальному домашнему заданию по ТПМИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ УКРАИНЫ
ДОНЕЦКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Кафедра АСУ
Отчёт
к индивидуальному домашнему заданию
по ТП
на тему:
«Разработка многопоточных W indows-приложений
в среде Borland C ++ Builder »
Вариант №7
Выполнил студент группы ИУС-04б
Ващилко Валентин
Проверили Землянская С.Ю.
Петров А.В.
Донецк 2007
Цель работы: Изучение способов создания и управления потоками в программах, разрабатываемых в среде BorlandC++ Builder. Изучение и использование методов взаимодействия потоков и визуальных компонентов библиотеки VCL.
Методические указания:
С использованием среды визуального программирования BorlandC++ Builder разработать и отладить многопоточное приложение, в котором необходимо предусмотреть следующее:
а) создать 3 вторичных объекта-потока, производных от класса TThread (1-й поток должен быть в запущенном состоянии, 2-й и 3-й – в приостановленном состоянии). В каждом из потоков описать функции вывода информации на соответствующие формы. Вызов этих функций будет производиться из метода Execute() соответствующего потока в бесконечном цикле, с помощью функции Synchronize() с периодичностью (задержкой) 0,1 сек;
б) разработать 3 формы (главную форму приложения и 2 формы) для взаимодействия с указанными потоками;
в) главная форма приложения должна быть размещена в центре экрана и состоять из 4-х частей: в верхней части должна быть надпись с информацией о данной работе (дисциплина, № работы, группа, ФИО студента), ниже постоянно выводится динамически изменяющаяся текстовая (числовая) информация или графическая фигура, выполняемые в 1-м вторичном потоке. В нижней половине формы должны располагаться 2 панели для управления 2-м и 3-м созданными потоками. Внизу формы помещается кнопка Выход.
г) на каждой панели вверху помещается название потока, а ниже размещаются компоненты для отображения состояния и управления соответствующим потоком. Информация о потоке (запущен, приостановлен, завершен) выводится с помощью компонентов Label. Управление потоком производится с помощью кнопок с названиями Запустить, Приостановить, Завершить. Изменение приоритета потока может производиться с помощью компонентов типа ComboBox, ListBox, RadioGroup по выбору студента.
д) при запуске приложения должна появиться главная форма, в верхней половине которой должны отображаться действия, выполняемые 1-м вторичным потоком согласно варианту задания. Два других потока должны находиться в приостановленном состоянии, о чем должны говорить надписи на панелях. При нажатии на любой панели кнопки Запустить должна появиться форма, на которой будет выводится динамически изменяющаяся текстовая (числовая) информация или графическая фигура, выполняемые в соответствующем потоке. При нажатии кнопки Приостановить работа соответствующего потока временно прекращается. При нажатии кнопки Завершить соответствующая форма закрывается, действие потока останавливается (без уничтожения объекта, для возможности повторного запуска потока).
№ Вар-та |
Действия, выполняемые в потоках и отображаемые на формах | ||
Поток 1 | Поток 2 | Поток 3 | |
7 | Компонент ScrollBar на форме циклически показывает плавное движение ползунка. | Последовательность цифр, выведенная с помощью компонента Label циклически сдвигается справо-налево, образуя бегущие числа. | Графическая фигура одного вида (компонент Shape) на форме изменяет свои размеры от min до max, а потом наоборот. |
Unit1.cpp
//---------------------------------------------------------------------------
#include vcl.h
#pragma hdrstop
#include Unit1.h
#include Unit2.h
#include Unit3.h
#include T2.h
#include T1.h
#include T3.h
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource *.dfm
TForm1 *Form1;
T1 *Thread1=newT1(false); // Поток 1 создан и запущен
T2 *Thread2=newT2(true); // Поток 2 создан и не запущен
T3 *Thread3=newT3(true); // Поток 3 создан и не запущен
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Label9-Caption=Запущен;
Form2-Show();
Thread2-Resume();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Label9-Caption=Приостановлен;
Thread2-Suspend();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Label9-Caption=Завершён;
Thread2-Terminate();
Form2-Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RadioGroup1Click(TObject *Sender)
{
switch (RadioGroup1-ItemIndex)
{
case 0: Thread2-Priority=tpLowest;
break;
case 1: Thread2-Priority=tpNormal;
break;
case 2: Thread2-Priority=tpHighest;
break;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
switch (ComboBox1-ItemIndex)
{
case 0: Thread3-Priority=tpLowest;
break;
case 1: Thread3-Priority=tpNormal;
break;
case 2: Thread3-Priority=tpHighest;
break;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
Label10-Caption=Запущен;
Form3-Show();
Thread3-Resume();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
Label10-Caption=Приостановлен;
Thread3-Suspend();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button6Click(TObject *Sender)
{
Label10-Caption=Завершён;
Thread3-Terminate();
Form3-Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button7Click(TObject *Sender)
{
exit(1);
}
//---------------------------------------------------------------------------
Unit2.cpp
//---------------------------------------------------------------------------
#include vcl.h
#pragma hdrstop
#include T2.h
#include Unit2.h
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource *.dfm
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
Unit3.cpp
//---------------------------------------------------------------------------
#include vcl.h
#pragma hdrstop
#include Unit3.h
#include T3.h
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource *.dfm
TForm3 *Form3;
//---------------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
T1.cpp
//---------------------------------------------------------------------------
#include vcl.h
#pragma hdrstop
#include Unit1.h
#include T1.h
#pragma package(smart_init)
//---------------------------------------------------------------------------
__fastcall T1::T1(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall T1::OutOnForm1()
{ static int i=2;
Form1-ScrollBar1-Position+=i;
if (Form1-ScrollBar1-Position == 100)
{Form1-ScrollBar1-Position=0;}
}
//---------------------------------------------------------------------------
void __fastcall T1::Execute()
{
for (;;)
{
Synchronize(OutOnForm1);
Sleep(100);
}
}
//---------------------------------------------------------------------------
T2.cpp
//---------------------------------------------------------------------------
#include vcl.h
#pragma hdrstop
#include Unit1.h
#include T2.h
#include Unit2.h
#pragma package(smart_init)
//---------------------------------------------------------------------------
__fastcall T2::T2(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall T2::OutOnForm2()
{ static int i=10;
Form2-Label1-Left-=i ;
if (Form2-Label1-Left -160)
{Form2-Label1-Left=370;}
}
//---------------------------------------------------------------------------
void __fastcall T2::Execute()
{
for (;;)
{
Synchronize(OutOnForm2);
Sleep(150);
}
}
//---------------------------------------------------------------------------
T3.cpp
//---------------------------------------------------------------------------
#include vcl.h
#pragma hdrstop
#include T3.h
#include Unit1.h
#include Unit3.h
#pragma package(smart_init)
//---------------------------------------------------------------------------
__fastcall T3::T3(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall T3::OutOnForm3()
{ static int i=5;
static int k;
static int f=0;
if (f==0)
{
for (k=40;k=100;k+=5);
{
Form3-Shape1-Width+=i;
Form3-Shape1-Height+=i;
if (Form3-Shape1-Width==100) {f=1;} ;
};
};
if(f==1)
{
for (k=100;k=40;k-=5);
{
Form3-Shape1-Width-=i;
Form3-Shape1-Height-=i;
if (Form3-Shape1-Width==40) {f=0;} ;
};
};
}
//---------------------------------------------------------------------------
void __fastcall T3::Execute()
{
for (;;)
{
Synchronize(OutOnForm3);
Sleep(150);
}
}
//---------------------------------------------------------------------------