Сравнительный анализ класса Thread в языках программирования C# и Delphi
Классы синхронизации потоков и классы для работы с потоком. Структуры, делегаты, перечисления и приоритет потока в языке С#. Одновременное выполнение нескольких операций. Создание потока, свойства и методы класса, приоритет потока в языке Delphi.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 13.05.2012 |
Размер файла | 50,8 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Министерство образования и науки
Смоленский государственный университет
Кафедра информатики
КУРСОВАЯ РАБОТА
Сравнительный анализ класса Thread в языках программирования C# и Delphi
Выполнила: студентка 3 курса
физико-математического факультета
специальности «Прикладная математика
и информатика»
БЕЛЯКОВА Елена Алексеевна
Научный руководитель
кандидат технических наук, доцент
кафедры информатики
МУНЕРМАН Виктор Иосифович
Смоленск 2012г.
СОДЕРЖАНИЕ
Введение
РАЗДЕЛ 1. Класс Thread в языке С#
1.1 Создание рабочего потока
1.2 Классы синхронизации потоков
1.3 Классы для работы с потоком
1.4 Структуры
1.5 Делегаты
1.6 Перечисления
1.7 Приоритет потока
РАЗДЕЛ 2. Класс Thread в языке Delphi
2.1 Создание потока
2.2 Свойства класса
2.3 Методы класса
2.4 Приоритет потока
Заключение
Приложения
Приложение 1. Простейшая программа для работы с потоком в C#
Приложение 2. Простейшая программа для работы с потоком в Delphi
Список используемой литературы
ВВЕДЕНИЕ
Мир не стоит на месте. Быстрота и правильность выполнения различного рода задач превратились в ключ к успеху практически в любом деле. И человечество сделало огромный шаг навстречу решению этой проблемы. Появились компьютеры - машины, скорость вычисления которых немыслимо велика по сравнению с человеческой.
Но жизнь снова требует поспешить, и перед разработчиками компьютерных программ встал еще один вопрос: Как же ускорить вычисления?
Естественно, самым простым решением будет приобретение технически более совершенной (читай - более дорогой) машины, чем имеется в наличии. Но не всем такое решение по карману, да и как-то оно узколобо. И тут на помощь приходит многоядерность современных процессоров.
Вкупе с многозадачностью современных операционных систем многоядерные процессоры дают возможность запуска большого числа ресурсоемких процессов без особого ущерба скорости работы, а также значительно увеличить эту самую скорость.
Но чтобы запустить процессы на разных ядрах, необходимо их разделить, причем получить от такого действия наибольший выигрыш. И здесь нам на помощь приходят современные среды программирования, имеющий широкий спектр инструментов для решения поставленной задачи.
Учитывая важность и сложность проблемы, я взяла на себя задачу провести сравнительный анализ класса Thread в языках программирования C# и Delphi. Мною будут рассмотрены различные методы, свойства и другие атрибуты класса, что в дальнейшем может служить подспорьем в выборе языка для решения той или иной задачи.
Работа будет состоять из двух обширных разделов и кода примеров, вынесенного в Приложения.
РАЗДЕЛ 1. Класс Thread в языке С#
По умолчанию программа на языке C# имеет один поток. Этот поток выполняет код при запуске и завершении программы с помощью метода Main. Каждая команда, выполняемая с помощью метода Main -- прямо или косвенно -- выполняется по умолчанию или посредством основного потока, и этот поток прекращает работу после возврата Main. Однако параллельно основному потоку могут создаваться и использоваться вспомогательные потоки. Эти потоки часто называются рабочими потоками.
Рабочие потоки могут использоваться для выполнения трудоемких или срочных задач без прерывания основного потока. Например, рабочие потоки часто используются в серверных приложениях для выполнения входящих запросов, не дожидаясь завершения выполнения предыдущего запроса. Рабочие потоки также используются для выполнения "фоновых" задач в настольных приложениях, что позволяет основному потоку (который отвечает за элементы пользовательского интерфейса) оставаться доступным для команд пользователя.
Многопоточность позволяет решить проблемы с пропускной способностью и быстротой ответа системы, однако при этом возникают проблемы совместного использования ресурсов, в частности взаимоблокировки и состояния гонки. Использование нескольких потоков лучше всего подходит для тех задач, которые используют различные ресурсы, например дескрипторы файлов и сетевые подключения. Назначение нескольких потоков одному ресурсу, вероятнее всего, вызовет проблемы синхронизации и частую блокировку потоков во время ожидания, что сведет к минимуму целесообразность использования нескольких потоков.
Обычно рабочие потоки используются для выполнения трудоемких или срочных задач, для которых не требуется большое количество ресурсов, используемых другими потоками. Естественно, некоторые используемые программой ресурсы должны быть доступны для нескольких потоков. В этих случаях пространство имен System.Threading предоставляет классы для синхронизации потоков. Но об этом чуть позже.
1.1 Создание рабочего потока
Потоки позволяют программе C# выполнять параллельную обработку, за счет чего появляется возможность одновременного выполнения нескольких операций. Например, потоки можно использовать для наблюдения ввода данных пользователем, выполнения фоновых задач и обработки одновременных потоков ввода.
Пространство имен System.Threading содержит классы и интерфейсы, поддерживающие многопоточное программирование, и позволяет без труда выполнять такие задачи как создание и запуск новых потоков, синхронизация нескольких потоков, приостановка потоков и их отмена.
Чтобы добавить поток в код C#, создайте функцию, которая будет выполняться вне главного потока и укажите в ней новый объект Thread. В следующем примере кода создается новый поток в приложении C#:
System.Threading.Thread newThread;
newThread = new System.Threading.Thread(anObject.AMethod);
Использование при программировании нескольких потоков элемента данных, доступ к которому будет осуществляться с нескольких потоков, необходимо использовать ключевое слово volatile. Оно указывает, что поле может быть изменено несколькими потоками, выполняющимися одновременно. Поля, объявленные как volatile, не проходят оптимизацию компилятором, которая предусматривает доступ посредством отдельного потока. Это гарантирует наличие наиболее актуального значения в поле в любое время.
Ключевое слово volatile можно применять к полям следующих типов.
· Ссылочные типы.
· Типы указателей (в небезопасном контексте). Обратите внимание, что, несмотря на то, что сам указатель может быть "volatile", объект, на который он указывает, таковым быть не может. Другими словами, нельзя объявить указатель "volatile".
· Целые типы, такие как sbyte, byte, short, ushort, int, uint, char, float и bool.
· Тип перечисления с целым базовым типом.
· Параметры универсальных типов, являющиеся ссылочными типами.
· IntPtr и UIntPtr.
Итак, фактически объект рабочего потока существует и уже настроен, фактический рабочий поток еще не создан. Этого не происходит до тех пор, пока Main не вызовет метод Start:
workerThread.Start();
На этом этапе система запускает созданный нами поток для выполнения.
1.2 Классы синхронизации потоков
Обычно рабочие потоки используются для выполнения трудоемких или срочных задач, для которых не требуется большое количество ресурсов, используемых другими потоками. Естественно, некоторые используемые программой ресурсы должны быть доступны для нескольких потоков. В этих случаях пространство имен System.Threading предоставляет классы для синхронизации потоков. Эти классы включают Mutex, Monitor, Interlocked, AutoResetEvent и ManualResetEvent.
Для примера рассмотрим подробнее Mutex.
Мьютексы -- это простейшие двоичные семафоры, которые могут находиться в одном из двух состояний -- отмеченном или неотмеченном (открыт и закрыт соответственно). Когда какой-либо поток, принадлежащий любому процессу, становится владельцем объекта Mutex, последний переводится в неотмеченное состояние. Если задача освобождает мьютекс, его состояние становится отмеченным.
Задача мьютекса -- защита объекта от доступа к нему других потоков, отличных от того, который завладел мьютексом. В каждый конкретный момент только один поток может владеть объектом, защищённым мьютексом. Если другому потоку будет нужен доступ к переменной, защищённой мьютексом, то этот поток засыпает до тех пор, пока мьютекс не будет освобождён.
Цель использования мьютексов -- защита данных от повреждения; однако им порождаются другие проблемы -- такие, как взаимная блокировка (клинч) и состояние гонки.
1.3 Классы для работы с потоками
В языке С# существует огромное число классов, позволяющих выполнять различные действия с целевым потоком. Для простоты восприятия я представила их в таблице:
Класс |
Описание |
||
AbandonedMutexException |
Исключение вызывается, когда некоторый поток получает объект Mutex, брошенный другим потоком путем выхода без высвобождения. |
||
AutoResetEvent |
Уведомляет ожидающий поток о том, что произошло событие. Этот класс не может наследоваться. |
||
CompressedStack |
Обеспечивает методы для установки и инициализации сжатого стека в текущем потоке. Этот класс не может быть наследован. |
||
EventWaitHandle |
Представляет синхронизированное событие потока. |
||
ExecutionContext |
Управляет контекстом выполнения текущего потока. Данный класс не может наследоваться. |
||
HostExecutionContext |
Инкапсулирует и распространяет контекст выполнения хоста по потокам. |
||
HostExecutionContextManager |
Обеспечивает функциональность, позволяющие хосту общеязыковой среды выполнения участвовать в перемещении или миграции контекста выполнения. |
||
Interlocked |
Предоставляет атомарные операции для переменных, общедоступных нескольким потокам. |
||
LockRecursionException |
Исключение генерируется, когда рекурсивная запись блокировки не совпадает с рекурсивной политикой блокировки. |
||
ManualResetEvent |
Уведомляет один или более ожидающих потоков о том, что произошло событие. Этот класс не может наследоваться. |
||
Monitor |
Предоставляет механизм для синхронизации доступа к объектам. |
||
Mutex |
Примитив синхронизации, который также может использоваться в межпроцессорной синхронизации. |
||
Overlapped |
Обеспечивает управляемое представление Win32 структуры OVERLAPPED, включая методы перемещения информации из экземпляра Overlapped в структуру NativeOverlapped. |
||
ReaderWriterLock |
Определяет блокировку, которая поддерживает один пишущий поток и несколько читающих. |
||
ReaderWriterLockSlim |
Представляет блокировку, используемую для управления доступом к ресурсу, которая позволяет нескольким потокам производить считывание или получать монопольный доступ на запись. |
||
RegisteredWaitHandle |
Представляет дескриптор, который регистрируется при вызове метода RegisterWaitForSingleObject. Данный класс не может наследоваться. |
||
Semaphore |
Ограничивает число потоков, которые могут одновременно получать доступ к ресурсу или пулу ресурсов. |
||
SemaphoreFullException |
Исключение, выдаваемое при вызове метода Semaphore.Release для семафора, значение счетчика которого уже равно максимальному. |
||
SynchronizationContext |
Обеспечивает базовую функциональность для распространения контекста синхронизации в различных моделях синхронизации. |
||
SynchronizationLockException |
Исключение, которое выдается в то время, когда методу требуется вызвавший его объект для получения блокировки данного Monitor, а метод вызван объектом, не являющимся владельцем блокировки. |
||
Thread |
Создает и контролирует поток, задает приоритет и возвращает статус. |
||
ThreadAbortException |
Исключение, выдаваемое при вызове метода Abort. Этот класс не может наследоваться. |
||
ThreadExceptionEventArgs |
Предоставляет данные для события ThreadException. |
||
ThreadInterruptedException |
Исключение, которое выдается при прерывании работы потока Thread, находящегося в состоянии ожидания. |
||
ThreadPool |
Предоставляет пул потоков, который может использоваться для создания рабочих элементов, обработки асинхронного ввода/вывода, ожидания от имени других потоков и обработки таймеров. |
||
ThreadStartException |
Исключение выдается, когда происходит сбой в управляемом потоке после запуска базового потока операционной системы, но до готовности потока к выполнению кода пользователя. |
||
ThreadStateException |
Исключение, которое выдается, когда объект Thread является неправильным свойством ThreadState для вызова метода. |
||
Timeout |
Содержит константу, которая используется для задания неограниченного количества времени. Данный класс не может наследоваться. |
||
Timer |
Предоставляет механизм для выполнения метода в заданные интервалы времени. Этот класс не может наследоваться. |
||
WaitHandle |
Инкапсулирует связанные с операционной системой объекты, ожидающие монопольного доступа к общим ресурсам. |
||
WaitHandleCannotBeOpenedException |
Исключение, которое выдается при попытке открыть не существующий в системе семафор или мьютекс. |
Как видно из таблицы, мы имеем достаточно большой спектр «помощников» для решения той или иной задачи. Я не стану подробно останавливаться на каждом из них, так как в этом нет необходимости в данной работе.
1.4 Структуры
Тип struct подходит для создания несложных объектов, таких как Point, Rectangle и Color. Хотя точку удобно представить в виде класса с автоматически реализуемыми свойствами, в некоторых сценариях структура может оказаться более эффективной. Например, при объявлении массива из 1000 объектов Point потребуется выделить дополнительную память для хранения ссылок на все эти объекты, и структура в таком случае будет более экономичным решением.
public struct CoOrds
{
public int x, y;
public CoOrds(int p1, int p2)
{
x = p1;
y = p2;
}
В таблице приведены структуры С#:
Структура |
Описание |
||
AsyncFlowControl |
Обеспечивает функциональность для восстановления миграции или перемещения контекста выполнения между потоками. |
||
LockCookie |
Определяет блокировку, которая реализует семантику "один записывающий / много читающих". Это тип значения. |
||
NativeOverlapped |
Содержит явное представление, видимое из неуправляемого кода, и которое имеет то же представление, что и структура Win32 OVERLAPPED с дополнительными зарезервированными полями в конце. |
1.5 Делегаты
Делегат (англ. delegates) -- структура данных, указывающая на статические методы или методы экземпляра класса в .NET Framework.
Понятия делегатов и событий всецело связаны друг с другом. Делегаты это указатели на функции. Delegate это класс. Когда вы создаете экземпляр этого класса, необходимо передать имя функции параметром конструктора класса делегата. На переданную функцию и будет ссылаться делегат.
Каждый делегат имеет сигнатуру. Делегат объявляется таким образом:
public delegate int PerformCalculation(int x, int y);
Когда мы говорим, что делегат имеет сигнатуру, то мы имеем ввиду, что делегат возвращает int и имеет два параметра int и int.
Делегаты C# представлены в таблице.
Делегат |
Описание |
||
ContextCallback |
Представляет метод, вызываемый в новом контексте. |
||
IOCompletionCallback |
Получает код ошибки, количество байтов и тип перекрывающегося значения при завершении операции ввода-вывода в пуле потоков. |
||
ParameterizedThreadStart |
Представляет метод, выполняющийся в объекте Thread. |
||
SendOrPostCallback |
Указывает метод, вызываемый при отправке сообщения в контекст синхронизации. |
||
ThreadExceptionEventHandler |
Предоставляет метод, обрабатывающий событие ThreadExceptionApplication. |
||
ThreadStart |
Представляет метод, выполняющийся в объекте Thread. |
||
TimerCallback |
Представляет метод, обрабатывающий вызовы от события Timer. |
||
WaitCallback |
Представляет метод обратного вызова, выполняющегося потоком из пула потоков. |
||
WaitOrTimerCallback |
Представляет метод, который вызывается при получении объектом WaitHandle сигнала или истечении времени ожидания. |
1.6 Перечисления
Тип перечисления (называемый также перечислением) предоставляет эффективный способ определения набора именованных интегральных констант, который можно назначить переменной. Например, предположим, что нужно определить переменную, значение, которое должно представлять день недели. Имеется только семь имеющих смысл значений, которые может принимать переменная. Для определения этих значений можно использовать тип перечисления, который объявлен с использованием ключевого слова enum. Например
поток язык delphi операция
enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
enum Months : byte { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec };
Перечисление |
Описание |
||
ApartmentState |
Задает апартаментное состояние потока Thread. |
||
EventResetMode |
Указывает, сбрасывается ли EventWaitHandle автоматически или вручную после получения сигнала. |
||
LockRecursionPolicy |
Указывает, можно ли несколько раз войти в блокировку из одного и того же потока. |
||
ThreadPriority |
Задает приоритет выполнения потока Thread. |
||
ThreadState |
Задает состояния выполнения объекта Thread. |
1.7 Приоритет потока
Свойство Priority определяет, сколько времени на исполнение будет выделено потоку относительно других потоков того же процесса. Существует 5 градаций приоритета потока:
enum ThreadPriority { Lowest, BelowNormal, Normal, AboveNormal, Highest }
Установка приоритета потока на максимум еще не означает работу в реальном времени (real-time), так как существуют еще приоритет процесса приложения. Чтобы работать в реальном времени, нужно использовать класс Process из пространства имен System.Diagnostics для поднятия приоритета процесса:
Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;
От ProcessPriorityClass.High один шаг до наивысшего приоритета процесса - Realtime. Устанавливая приоритет процесса в Realtime, вы говорите операционной системе, что хотите, чтобы ваш процесс никогда не вытеснялся. Если ваша программа случайно попадет в бесконечный цикл, операционная система может быть полностью заблокирована. Спасти вас в этом случае сможет только кнопка выключения питания. По этой причине ProcessPriorityClass.High считается максимальным приоритетом процесса, пригодным к употреблению.
РАЗДЕЛ 2. Класс Thread в языке Delphi
Потоки в Delphi выполняют функцию параллельной работы приложения. Как известно, для организации многозадачности операционная система выделяет каждому приложению, выполняющемуся в настоящий момент, определённые кванты времени, длина и количество которых определяется его приоритетом. Поэтому объём работы, который приложение может выполнить, определяется тем, сколько таких квантов оно сможет получить в единицу времени. Для операционной системы каждый поток является самостоятельной задачей, которой выделяются кванты времени на общих основаниях. Поэтому приложение Delphi, умеющее создать несколько потоков, получит больше времени операционной системы, и соответственно сможет выполнить больший объём работы.
2.1 Создание потока
Создать дополнительный поток в Delphi поможет объект TThread. Ввести объект TThread в программу можно двумя способами:
Первый способ:
Мастер создания дополнительного потока в Delphi создаёт отдельный модуль, в рамках которого выполняется поток. Выполним:
File->New->Other...
В появившейся табличке выбора найдём TThread Object. Появится окошко, в верхнюю строку которого (Class Name) введём имя нашего будущего потока: MyThread.
В результате будет создан модуль, содержащий заготовку кода, реализующего дополнительный поток Delphi.
unit ThreadModule;
interface
uses
Classes;
Type
MyThread = class(TThread) //MyThread - заданное нами имя потока.
private
{ Private declarations }
Protected
procedure Execute; override;
end;
implementation
{ Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure MyThread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
{ MyThread }
procedure MyThread.Execute;
begin
{ Place thread code here }
end;
end.
Второй способ:
В первом способе класс MyThread был создан мастером в дополнительном модуле. Второй способ состоит в том, что мы сами создаём такой класс в рамках одного из уже существующих модулей программы:
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
Type
TMainF = class(TForm)
CheckButton: TButton;
procedure CheckButton Click(Sender: TObject);
private
{ Private declarations }
Public
{ Public declarations }
end;
//Здесь необходимо описать класс TMyThread:
TMyThread = class(TThread)
Private
{ Private declarations }
Protected
procedure Execute; override;
end;
var
MainF: TMainF;
//Нужно ввести переменную класса TMyThread
MyThread: TMyThread;
Implementation
$R *.dfm}
//Нужно создать процедуру Execute, уже описанную в классе TMyThread
procedure TMyThread.Execute;
begin
Здесь описывается код, который будет выполняться в потоке end;
2.3 Свойства класса
Перечень свойств класса TThread приведен в таблице.
Свойство |
Описание |
|
FreeOnTerminate : boolean |
Если требуется автоматическое уничтожение потока после его завершения, это свойство должно быть установлено в true. Если оно установлено в false, то требуется самостоятельно вызывать деструктор |
|
Handle : integer |
Описатель потока, который необходим при манипуляциях с потоком с помощью функций Win32 API |
|
Priority |
Приоритет потока |
|
ReturnValue : integer |
Код результата завершения потока, устанавливаемый программистом. Его значение может получить процесс или другой поток с помощью метода WaitFor |
|
Suspended : boolean |
Приостанавливает выполнение потока (true). Для возобновления выполнения потока необходимо установить его в false (или вызвать метод Resume) |
|
Terminated : boolean |
Значение true указывает на то, что поток должен завершить работу. Значение этого свойства следует анализировать в методе Execute для того, чтобы (преждевременно) завершить поток |
|
ThreadID : integer |
Идентификатор потока, который полезен при отладке и необходим при использовании функций Win32 API. Он не совпадает с описателем Handle |
2.3 Методы класса
Класс TThread является производным от класса TObject и включает 9 методов, приведенных в таблице.
Метод |
Назначение |
|
Create |
Конструктор потока с одним параметром булевского типа CreateSuspended (suspended - приостановленный). Если этот параметр равен false, поток сразу начинает выполняться с метода Execute, а в противном случае выполнение потока должно быть начато с вызова метода Resume |
|
Destroy |
Деструктор, который редко вызывается непосредственно |
|
Execute |
Абстрактный метод, с которого начинается выполнение потока. Выполнение потока прекращается, когда завершается выполнение этого метода |
|
Suspend |
Приостанавливает выполнение потока с возможностью возобновления его выполнения с прерванной точки с помощью метода Resume |
|
Resume |
Возобновляет выполнение приостановленного потока с точки, в которой он был приостановлен |
|
DoTerminate |
Генерирует событие OnTerminate, но не прекращает выполнение потока |
|
Terminate |
Прекращает выполнение потока. Этот метод, при необходимости, может быть вызван для прекращения потока, но это редко делается |
|
Synchronize |
Обеспечивает безопасный вызов методов VCL внутри потоков |
|
WaitFor |
Этот метод позволяет дождаться завершения потока и получить код результата ReturnValue |
Для выполнения того или иного действия в программе нужно лишь определиться с выбором метода и корректно использовать его в коде.
2.4 Приоритет потока
Приоритет - это величина, определяющая, насколько данный процесс должен выполнятся быстрее по сравнению с другими. Т.е., другими словами, чем выше приоритет процесса, тем больше времени он отбирает у системы и других, параллельно работающих процессов. Далее разберем возможные значения свойства Priority класса TThread в порядке возрастания приоритета:
· tpIdle - процесс выполняется только тогда, когда система не занята и больше нет работающих в данных момент процессов;
· tpLowest - на два пункта ниже нормального;
· tpLower - на один пункт ниже нормального;
· tpNormal - нормальный. Такой приоритет у большинства задач;
· tpHigher - на один пункт выше нормального;
· tpHighest - на два пункта выше нормального;
· tpTimeCritical - самый высокий приоритет - занимает все время процессора и системы. Это приоритет для систем реального времени, для которых важна каждая секунда и даже малейшая задержка может привести к сбою.
Заключение
Итак, распараллеливание процессов в программе дает ощутимое ускорение ее выполнения. Однако задача параллелизации программы совсем не легкая, намного по сложности превосходящая программирование классическое. Для начала программист должен решить, какой язык программирования наиболее предпочтителен для решения поставленной задачи.
Как мы видим, в языке C# ощутимо больше различных средств для работы с потоками, позволяющих буквально «по битам» разобрать поток. Delphi же не предоставляет нам такой возможности, оставляя данную привилегию самой среде.
Я не являюсь ярым приверженцем какого-либо языка программирования. Мне кажется, что профессионал должен знать методы решения поставленной перед ним задачи, то есть иметь представление об алгоритмах и приемах программирования, а реализация кода в той или иной среде - это уже вторично. Программист должен иметь примерное представление о возможностях того или иного языка и делать выбор с учетом наиболее удобной дл реализации среды.
Приложение
Приложение 1
Простейшая программа для работы с потоком в C#
using System;
using System.Threading;
public class Worker
{
// This method will be called when the thread is started.
public void DoWork()
{
while (!_shouldStop)
{
Console.WriteLine("worker thread: working...");
}
Console.WriteLine("worker thread: terminating gracefully.");
}
public void RequestStop()
{
_shouldStop = true;
}
// Volatile is used as hint to the compiler that this data
// member will be accessed by multiple threads.
private volatile bool _shouldStop;
}
public class WorkerThreadExample
{
static void Main()
{
// Create the thread object. This does not start the thread.
Worker workerObject = new Worker();
Thread workerThread = new Thread(workerObject.DoWork);
// Start the worker thread.
workerThread.Start();
Console.WriteLine("main thread: Starting worker thread...");
// Loop until worker thread activates.
while (!workerThread.IsAlive);
// Put the main thread to sleep for 1 millisecond to
// allow the worker thread to do some work:
Thread.Sleep(1);
// Request that the worker thread stop itself:
workerObject.RequestStop();
// Use the Join method to block the current thread
// until the object's thread terminates.
workerThread.Join();
Console.WriteLine("main thread: Worker thread has terminated.");
}
Приложение 2
Простейшая программа для работы с потоком в Delphi
unit SimpleProg;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
Type
TFSimple = class(TForm)
Start_Button: TButton;
procedure Start_Button Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FSimple: TFSimple;
MyThread: TMyThread;
unit ThreadUnit;
interface
uses
Classes;
type
MyThread = class(TThread) private
{ Private declarations }
protected
procedure Execute; override;
end;
implementation
{ Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure MyThread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
{ MyThread }
procedure MyThread.Execute;
begin
{ Place thread code here }
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
//Вначале нужно создать экземпляр потока:
MyThread:=TMyThread.Create(False);
//Параметр False запускает поток сразу после создания, True - запуск впоследствии , методом Resume
//Далее можно указать параметры потока, например приоритет:
MyThread.Priority:=tpNormal;
//Можно указать что после завершения кода поток завершится автоматически:
MyThread.FreeOnTerminate:=true;
end;
end.
Список используемой литературы
1. Архангельский А.Я Программирование в Delphi. - М.: БИНОМ, 2008.
2. Воеводин В.В., Воеводин Вл.В. Параллельные вычисления. - СПб: БХВ Петербург, 2002.
3. Петр Дарахвелидзе, Евгений Марков Программирование в Delphi 7. - СПб: БХВ-Петербург, 2003.
Размещено на Allbest.ru
Подобные документы
Создание потока с помощью конструктора на основе класса Thread, интерфейса Runnable, синхронизации потоков. Краткая справка по необходимым программным компонентам. Составление программы анимации мячей пространстве окна. Диаграмма классов приложения.
лабораторная работа [884,9 K], добавлен 01.05.2014Принципы и порядок работы с файлами на языке Delphi, получение навыков программирования с использованием файлов. Создание каталога продуктов. Страница палитры компонентов, настраиваемые компоненты и их значения. Текст программы и ее тестирование.
лабораторная работа [243,9 K], добавлен 09.01.2009Изучение организации диалоговой программы и закрепления основных элементов программирования на языке Паскаль и Си (Delphi, C++ Builder). Описание представления информации в программах на языках высокого уровня. Сравнительная характеристика Delphi и C++.
курсовая работа [3,1 M], добавлен 27.02.2015Классы и свойства объектно-ориентированного пространства. Методика создания новых классов в delphi: выбор родительского класса, изменение существующих компонентов, создание подклассов для элементов управления windows. Создание новой ветви классов.
контрольная работа [13,0 K], добавлен 07.07.2012Понятие многопоточности. История возникновения и развития параллельного программирования. Квазимногозадачность на уровне исполняемого процесса. Типы реализации потоков, их взаимодействие и общее ресурсы. Критические секции. Классы и процедуры в Delphi.
курсовая работа [1,1 M], добавлен 20.09.2013Разработка программы автоматизации процесса проверки знаний учащихся. Использование языка программирования Borland Delphi 7.0, его свойства, компоненты для работы со строками. Создание обучающих тестов на знание лексики и грамматики английского языка.
курсовая работа [521,0 K], добавлен 06.03.2016Освоение языка программирования Delphi. Построение блок-схемы запуска главного таймера и основная логика программы. Использованные свойства и события Form, MediaPlayer, Timer, MainMenu. Запуск, пауза и остановка анимациии. Создание листинга программы.
курсовая работа [771,9 K], добавлен 22.06.2014Представление о потоках выполнения. Последовательный алгоритм ходьбы, бега и быстрого шага. Создание потоков на основе класса Thread и интерфейса Runnable, в Java. Синхронизация на ресурсах, объектах, методах, событиях. Константы и методы класса Thread.
лекция [556,1 K], добавлен 01.05.2014История развития, характеристика, предназначение и особенности языка программирования Delphi. Разработка проекта создания кроссворда на объектно-ориентированном языке Delphi, который состоит из 19 вопросов по горизонтали и 16 вопросов по вертикали.
курсовая работа [970,5 K], добавлен 15.05.2014Особенности и тонкости программирования в среде Delphi. Специфика перехода от алгоритмического решения к непосредственной программной реализации на языке Object Pascal с использованием всех необходимых средств данного языка. Анализ полученных результатов.
реферат [246,2 K], добавлен 17.11.2012