![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Поток с использованием семафораDelphi , Компоненты и Классы , ПотокиАвтор: 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; hSem: THandle = 0; function GetNextNumber: Integer; begin Result := NextNumber; // return global var Inc(NextNumber); // inc global var end; procedure TFooThread.Execute; var i: Integer; WaitReturn: DWORD; begin OnTerminate := MainForm.ThreadsDone; WaitReturn := WaitForSingleObject(hSem, INFINITE); if WaitReturn = 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; ReleaseSemaphore(hSem, 1, nil); 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(hSem); end; end; procedure TMainForm.Button1Click(Sender: TObject); begin hSem := CreateSemaphore(nil, 1, 1, nil); TFooThread.Create(False); // create threads TFooThread.Create(False); end; end. Перевод контента на русский язык: Это проект Delphi, который создает два потока с помощью компонента Семафор ( Когда оба потока закончили работу, процедура Код можно улучшить, добавив более ошибок и обработки. Например, вы можете проверять, не возникло ли ошибка при создании семафора или потоков, и обрабатывать эти ошибки соответствующим образом. Альтернативное решение с использованием
В этом альтернативном решении используется Статья описывает пример использования семафора в многопоточном программировании на языке Delphi для синхронизации доступа к общим ресурсам между потоками. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |