
- •Лабораторная работа № 1
- •1. Теоретические сведения
- •2. Задания к лабораторной работе Задание 1.1. Создание простого Windows-приложения
- •Задание 1.2. Модификация простого Windows-приложения
- •Задание 2. Создание консольного приложения
- •Задание 3.1. Использование tThread для разработки потоков команд
- •Задание 3.2. Создание нескольких потоков
- •Контрольные вопросы
Задание 3.1. Использование tThread для разработки потоков команд
Цель: изучить класс TThread и научиться создавать многопоточные приложения, с помощью которых можно исследовать некоторые параллельные алгоритмы.
Для первоначального изучения процесса разработки многопоточных приложений важно внимательно и четко выполнить следующую последовательность действий:
В пользовательском (личном) каталоге создайте отдельную папку для проекта;
Запустите Borland C++ Builder и создайте шаблон консольного приложения(смотри задание 2);
Выполните команду FiIe|New в главном меню;
В появившейся вкладке New Itemsвыберите объектThread Object;
В диалоговом окне, предлагающем ввести имя класса производного от TThread, наберите название нового класса, напримерTThread1и нажмитеOK. В результате будет создан новый модуль с именемUnit1.cpp, содержащий реализацию функций-членовExecute()и конструктора нового (дочернего) потока;
Создайте дополнительный модуль. Для этого выберите в меню пункт File|New Unit, будет создан пустой модульUnit2.cpp;
Сохраните проект в созданном каталоге. При этом переименуйте Unit1.cppвThrdtyp.cpp, аUnit2.cpp‑ вcommon.cpp;
В файле common.cppпоместите функцию, которая выводит на экран 20 раз строкуpи число:
void WriteOut(char *p)
{
for(int i=0;i<20;i++)
printf("%s %i\n",p,i);
}
В заголовочном файле common.h(создается автоматически) поместите прототип этой функции:
void WriteOut(char *p);
С помощью директивы #includeвключите этот файл во все файлы с расширением.cpp;
Модифицируйте конструктор (в файле Thrdtyp.cpp):
__fastcall TThread1::TThread1(char *s, bool CreateSuspended): TThread(CreateSuspended)
{
name=s;
}
Приведите в соответствие текст файла Thrdtyp.h, он должен иметь вид:
//----------------------------------------------------------------
#ifndef ThrdtypH
#define ThrdtypH
//----------------------------------------------------------------
#include <vcl\Classes.hpp>
//----------------------------------------------------------------
class TThread1:public TThread
{
private:
protected:
char *name;
void __fastcall Execute();
public:
__fastcall TThread1(char *s, bool CreateSuspended);
};
//----------------------------------------------------------------
#endif
Переопределите функцию void __fastcall TThread1::Execute()таким образом, чтобы она вызывала функциюWriteOut()и идентифицировала поток команд:
void __fastcall TThread1::Execute()
{
WriteOut(name);
}
В основной программе создайте экземпляр класса TThread1и запустите поток одновременно с выполнением основной программой вызова функцииWriteOut():
#include <vcl\condefs.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include "Thrdtyp.h"
#include "common.h"
#pragma hdrstop
//--------------------------------------------------------------
USERES("thrdex.res");
USEUNIT("Thrdtyp.cpp");
USEUNIT("common.cpp");
//--------------------------------------------------------------
int main(int argc, char **argv)
{
TThread1 *Thread1;
Thread1=new TThread1("Thread",false); //cоздаем экземпляр класса
//и запускаем его
WriteOut("Main"); //выполняем основной поток команд
Thread1->WaitFor(); //ожидаем окончания работы дочернего потока
Thread1->Free(); //вызов деструктора
puts("Press any key");
getch();
return 0;
}
Сохраните все файлы проекта и запустите его.