Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения
KANSoftWare

Поток с использованием Mutexa

Delphi , Компоненты и Классы , Потоки

Поток с использованием Mutexa

Автор: 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. Программа создает два потока, которые выполняются параллельно и заполняют массив числами, а также обновляют список элементов на основном формате.

Основной формат Класс TMainForm представляет собой основной формат приложения. Он имеет кнопку (Button1) и список элементов (ListBox1). Когда кнопка нажата, она создает два потока с помощью класса TFooThread.

Поток Foo Класс TFooThread - это поток, который выполняется параллельно с другими потоками в системе. Каждый экземпляр этого класса заполняет массив числами и обновляет список элементов на основном формате.

Когда программа запущена: 1. Нажата кнопка, что создает два экземпляра класса TFooThread. 2. Каждый поток ожидает, пока мьютекс (hMutex) не будет освобожден перед выполнением кода. 3. Когда мьютекс освобожден, каждый поток заполняет массив числами и обновляет список элементов на основном формате. 4. Когда оба потока закончили заполнять массив, они освобождают мьютекс. 5. Основной формат проверяет, закончили ли оба потока работу, проверяя переменную DoneFlags. Если оба потока закончили, он закрывает мьютекс и отображает содержимое массива в списке элементов.

Синхронизация с помощью мьютекса Использование мьютекса (hMutex) обеспечивает, что только один поток может доступаться к общим ресурсам (массиву и списку элементов) в любое время. Это предотвращает коррупцию данных и обеспечивает, что программа работает правильно даже при выполнении нескольких потоков параллельно.

Улучшения Вот несколько предложений по улучшению кода: 1. Используйте более надежный способ обработки ошибок. Например, вы можете использовать блоки try-except для ловли исключений и отображения сообщений об ошибках. 2. Рассмотрите возможность использования более эффективной структуры данных, чем массив, для хранения чисел. Например, вы могли бы использовать динамический массив или список. 3. Возможно, вам нужно рассмотреть использование более сложной механики синхронизации, такой как семафор или критическая секция, если вам нужно координировать доступ к нескольким общим ресурсам.

В целом, это хороший пример использования мьютексов для синхронизации потоков в Delphi. С некоторыми дополнительными улучшениями он мог быть еще более надежным и эффективным.

В статье описана программа на языке Delphi, которая использует Mutex для синхронизации доступа к глобальным переменным между несколькими потоками.


Комментарии и вопросы


Ваше мнение или вопрос к статье в виде простого текста (Tag <a href=... Disabled). Все комментарии модерируются, модератор оставляет за собой право удалить непонравившейся ему комментарий.

заголовок

e-mail

Ваше имя

Сообщение

Введите код




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Потоки ::


реклама



©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-06-02 10:20:12
2024-06-16 02:40:33/0.0071780681610107/2