⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.pas

📁 线程同步代码集很经典
💻 PAS
字号:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ProgressBar1: TProgressBar;
    ProgressBar2: TProgressBar;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  SemaphoreHandle: thandle;

implementation

{$R *.DFM}

procedure ThreadFunc1;
var
  ICount: Integer;
begin
  {等待信号值为非0。第二个参数是超时的毫秒值,INFINITE表示永不超时}
  WaitForSingleObject(SemaphoreHandle, INFINITE);
  {获得控制权后,信号值减1}
  for ICount := 1 to 100000 do
  begin
    Form1.ProgressBar1.position := ICount;
  end;
  {释放信号灯,信号值加1}
  ReleaseSemaphore(SemaphoreHandle, 1, nil);
end;

procedure ThreadFunc2;
const
  SEMAPHORE_ALL_ACCESS=STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $3;
var
  ICount: Integer;
  SHandle: THandle; {信号灯句柄}
  PrevCount: DWORD; {当前信号量计数}
begin
  {打开信息灯}
  SHandle := OpenSemaphore(SEMAPHORE_ALL_ACCESS, FALSE,
    'MikesSemaphore');
  {等待信号值为非0}
  WaitForSingleObject(SHandle, INFINITE);
  for ICount := 1 to 100000 do
  begin
    Form1.ProgressBar2.Position := ICount;
  end;
  {释放信号灯,信号值加1}
  ReleaseSemaphore(SHandle, 1, @PrevCount);
  Form1.Button1.Enabled:=true;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  ThreadId1, ThreadId2: DWORD;
begin
  {创建信号量,信号值初始值是1,最大值是2}
  Button1.Enabled:=false;
  SemaphoreHandle := CreateSemaphore(nil, 1, 2, 'MikesSemaphore');
  ProgressBar1.Position:=0;
  ProgressBar2.Position:=0;
  {创建并执行第一个线程}
  CreateThread(nil, 0, @ThreadFunc1, nil, 0, ThreadId1);
  {创建并执行第二个线程}
  CreateThread(nil, 0, @ThreadFunc2, nil, 0, ThreadId2);
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -