![]() |
![]() ![]() ![]() ![]() |
|
Поток с использованием MutexaDelphi , Компоненты и Классы , ПотокиАвтор: Xavier Pacheco
unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TMainForm = class(TForm)
Button1: TButton;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
private
procedure ThreadsDone(Sender: TObject);
end;
TFooThread = class(TThread)
protected
procedure Execute; override;
end;
var
MainForm: TMainForm;
implementation
{$R *.DFM}
const
MaxSize = 128;
var
NextNumber: Integer = 0;
DoneFlags: Integer = 0;
GlobalArray: array[1..MaxSize] of Integer;
hMutex: THandle = 0;
function GetNextNumber: Integer;
begin
Result := NextNumber; // return global var
Inc(NextNumber); // inc global var
end;
procedure TFooThread.Execute;
var
i: Integer;
begin
FreeOnTerminate := True;
OnTerminate := MainForm.ThreadsDone;
if WaitForSingleObject(hMutex, INFINITE) = WAIT_OBJECT_0 then
begin
for i := 1 to MaxSize do
begin
GlobalArray[i] := GetNextNumber; // set array element
Sleep(5); // let thread intertwine
end;
end;
ReleaseMutex(hMutex);
end;
procedure TMainForm.ThreadsDone(Sender: TObject);
var
i: Integer;
begin
Inc(DoneFlags);
if DoneFlags = 2 then // make sure both threads finished
begin
for i := 1 to MaxSize do
{ fill listbox with array contents }
Listbox1.Items.Add(IntToStr(GlobalArray[i]));
CloseHandle(hMutex);
end;
end;
procedure TMainForm.Button1Click(Sender: TObject);
begin
hMutex := CreateMutex(nil, False, nil);
TFooThread.Create(False); // create threads
TFooThread.Create(False);
end;
end.
Эта программа на языке Delphi демонстрирует использование мьютексов для синхронизации потоков в Windows. Программа создает два потока, которые выполняются параллельно и заполняют массив числами, а также обновляют список элементов на основном формате. Основной формат
Класс Поток Foo
Класс Когда программа запущена:
1. Нажата кнопка, что создает два экземпляра класса Синхронизация с помощью мьютекса
Использование мьютекса ( Улучшения Вот несколько предложений по улучшению кода: 1. Используйте более надежный способ обработки ошибок. Например, вы можете использовать блоки try-except для ловли исключений и отображения сообщений об ошибках. 2. Рассмотрите возможность использования более эффективной структуры данных, чем массив, для хранения чисел. Например, вы могли бы использовать динамический массив или список. 3. Возможно, вам нужно рассмотреть использование более сложной механики синхронизации, такой как семафор или критическая секция, если вам нужно координировать доступ к нескольким общим ресурсам. В целом, это хороший пример использования мьютексов для синхронизации потоков в Delphi. С некоторыми дополнительными улучшениями он мог быть еще более надежным и эффективным. В статье описана программа на языке Delphi, которая использует Mutex для синхронизации доступа к глобальным переменным между несколькими потоками. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 | ||||