SemaphoreFrm.pas
上传用户:psxgmh
上传日期:2013-04-08
资源大小:15112k
文件大小:3k
源码类别:

Delphi/CppBuilder

开发平台:

Delphi

  1. unit SemaphoreFrm;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs, StdCtrls;
  6. type
  7.   //定义一个线程类
  8.   TsyncThread = class(TThread)
  9.   protected
  10.     procedure execute; override;
  11.   end;
  12.   TfrmSemaphore = class(TForm)
  13.     ListBox1: TListBox;
  14.     btnExecute: TButton;
  15.     ListBox2: TListBox;
  16.     Label1: TLabel;
  17.     Label2: TLabel;
  18.     procedure btnExecuteClick(Sender: TObject);
  19.     procedure FormCreate(Sender: TObject);
  20.     procedure FormDestroy(Sender: TObject);
  21.   private
  22.     //定义线程实例变量
  23.     Thread1, Thread2: TSyncThread;
  24.     //自定义过程,在线程结束时调用
  25.     procedure Thread1Done(sender: TObject);
  26.     procedure Thread2Done(sender: TObject);
  27.     { Private declarations }
  28.   public
  29.     { Public declarations }
  30.   end;
  31. const
  32.   MaxSize = 100;
  33. var
  34.   frmsemaphore: Tfrmsemaphore;
  35.   //数据全局区
  36.   GlobalData: array[1..MaxSize] of integer;
  37.   IncNum: Integer = 0;
  38.  //定义信号量对象句柄
  39.   HSem: THandle = 0;
  40. implementation
  41. {$R *.dfm}
  42. //线程执行主体
  43. procedure TSyncThread.execute;
  44. var
  45.   i: integer;
  46.   WaitReturn: DWORD;
  47. begin
  48.   FreeOnTerminate := True;
  49.   //  //进入同步,防止其他线程访问
  50.   WaitReturn := WaitForSingleObject(HSem, INFINITE);
  51.   if WaitReturn = Wait_Object_0 then
  52.     for i := 1 to Maxsize do
  53.     begin
  54.       Inc(IncNum);
  55.       GlobalData[i] := IncNum;
  56.       sleep(5);
  57.     end;
  58. end;
  59. //在窗体创建时,创建信号量
  60. procedure TfrmSemaphore.FormCreate(Sender: TObject);
  61. begin
  62.   HSem := CreateSemaphore(nil, 1, 1, nil);
  63. end;
  64. //在窗体释放时,释放信号量
  65. procedure TfrmSemaphore.FormDestroy(Sender: TObject);
  66. begin
  67.   CloseHandle(HSem);
  68. end;
  69. //创建线程实例
  70. procedure Tfrmsemaphore.btnExecuteClick(Sender: TObject);
  71. begin
  72.   Thread1 := TSyncThread.Create(false);
  73.   Thread1.OnTerminate := Thread1Done;
  74.   Thread2 := TSyncThread.Create(false);
  75.   Thread2.OnTerminate := Thread2Done;
  76. end;
  77. //当线程1执行完后,将GlobalData数据显示出来
  78. procedure TfrmSemaphore.Thread1Done(sender: TObject);
  79. var
  80.   i: integer;
  81. begin
  82.   ListBox1.Items.Clear;
  83.   for i := 1 to MaxSize do
  84.     Listbox1.Items.Add(intToStr(GlobalData[i]));
  85.   //撤消等待,让其他线程可以访问
  86.   ReleaseSemaphore(HSem, 1, nil);
  87. end;
  88. //当线程2执行完后,将GlobalData数据显示出来
  89. procedure TfrmSemaphore.Thread2Done(sender: TObject);
  90. var
  91.   i: integer;
  92. begin
  93.   ListBox2.Items.Clear;
  94.   for i := 1 to MaxSize do
  95.     Listbox2.Items.Add(intToStr(GlobalData[i]));
  96.     //撤消等待,让其他线程可以访问
  97.   ReleaseSemaphore(HSem, 1, nil);
  98. end;
  99. end.