![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
![]() |
Поток с использованием MutexaDelphi , Компоненты и Классы , ПотокиПоток с использованием 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. Программа создает два потока, которые выполняются параллельно и заполняют массив числами, а также обновляют список элементов на основном формате. Основной формат
Класс Поток Foo
Класс Когда программа запущена:
1. Нажата кнопка, что создает два экземпляра класса Синхронизация с помощью мьютекса
Использование мьютекса ( Улучшения Вот несколько предложений по улучшению кода: 1. Используйте более надежный способ обработки ошибок. Например, вы можете использовать блоки try-except для ловли исключений и отображения сообщений об ошибках. 2. Рассмотрите возможность использования более эффективной структуры данных, чем массив, для хранения чисел. Например, вы могли бы использовать динамический массив или список. 3. Возможно, вам нужно рассмотреть использование более сложной механики синхронизации, такой как семафор или критическая секция, если вам нужно координировать доступ к нескольким общим ресурсам. В целом, это хороший пример использования мьютексов для синхронизации потоков в Delphi. С некоторыми дополнительными улучшениями он мог быть еще более надежным и эффективным. В статье описана программа на языке Delphi, которая использует Mutex для синхронизации доступа к глобальным переменным между несколькими потоками. Комментарии и вопросыМатериалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |