unit Main;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TMainForm = class(TForm)
Button1: TButton;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure ThreadsDone(Sender: TObject);
public
{ Public declarations }
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;
Inc(NextNumber);
end;{ TFooThread }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;
Sleep(5);
end;
end;
ReleaseSemaphore(hSem,1,nil);
end;{ TMainForm }procedure TMainForm.Button1Click(Sender: TObject);
begin
hSem := CreateSemaphore(nil,1,1,nil);
TFooThread.Create(False);
TFooThread.Create(False);
end;procedure TMainForm.ThreadsDone(Sender: TObject);
var
i: Integer;
begin
Inc(DoneFlags);
if DoneFlags = 2 then
begin
for i := 1 to MaxSize do
begin
Listbox1.Items.Add(IntToStr(GlobalArray[i]));
CloseHandle(hSem);
end;
end;
end;end.
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TMainForm = class(TForm)
Button1: TButton;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure ThreadsDone(Sender: TObject);
public
{ Public declarations }
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;
Inc(NextNumber);
end;{ TFooThread }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;
Sleep(5);
end;
end;
ReleaseSemaphore(hSem,1,nil);
end;{ TMainForm }procedure TMainForm.Button1Click(Sender: TObject);
begin
hSem := CreateSemaphore(nil,1,1,nil);
TFooThread.Create(False);
TFooThread.Create(False);
end;procedure TMainForm.ThreadsDone(Sender: TObject);
var
i: Integer;
begin
Inc(DoneFlags);
if DoneFlags = 2 then
begin
for i := 1 to MaxSize do
begin
Listbox1.Items.Add(IntToStr(GlobalArray[i]));
CloseHandle(hSem);
end;
end;
end;end.
解决方案 »
- 关于DELPHI 时间限制的问题.if DateToStr(Date)>='2011-1-30' then 格式问题
- ActionManager这个控件,用户设置菜单时可以是中文界面的吗?
- SDK完全手工自作基本控件的问题
- 谁能告诉我命令行编译DELPHI工程的方法
- 大侠救命,以分相许。
- 能不能用dbtext做查询条件??
- 如何获得主机名
- 如何用Delphi的sql monitor来判断oracle表中的记录是否违背唯一性原则?
- 使用application.createform创建窗体怎么总是出错?
- 求助,如何取出出现最多的值?
- DSPack怎样实现无黑屏连续播放多个文件?
- 求不用任何控件,直接对串口操作的一个典型的例子
代码中的这一段出现问题:
for i := 1 to MaxSize do
//原来这里有begin 会出现错误,很奇怪,为什么?
Listbox1.Items.Add(IntToStr(GlobalArray[i]));
CloseHandle(hSem);
//原来这里有end;
估计是释放资源出现了问题。
begin
Listbox1.Items.Add(IntToStr(GlobalArray[i]));
CloseHandle(hSem);
end;