📄 unit1.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 + -