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

Delphi/CppBuilder

开发平台:

Delphi

  1. unit MutexFrm;
  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.   TfrmMutex = 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.   frmMutex: TfrmMutex;
  35.   //数据全局区
  36.   GlobalData: array[1..MaxSize] of integer;
  37.   IncNum: Integer = 0;
  38.   //定义互斥对象句柄
  39.   HMutex: 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(HMutex, 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(10);
  57.     end;
  58. end;
  59. //在窗体创建时,创建互斥量
  60. procedure TfrmMutex.FormCreate(Sender: TObject);
  61. begin
  62.   HMutex := CreateMutex(nil, false, nil);
  63. end;
  64. //在窗体释放时,释放互斥量
  65. procedure TfrmMutex.FormDestroy(Sender: TObject);
  66. begin
  67.   CloseHandle(HMutex);
  68. end;
  69. //创建线程实例
  70. procedure TfrmMutex.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 TfrmMutex.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.   ReleaseMutex(HMutex);
  87. end;
  88. //当线程2执行完后,将GlobalData数据显示出来
  89. procedure TfrmMutex.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.   ReleaseMutex(HMutex);
  98. end;
  99. end.