在写多线程下sleep的功能,能否详细一点
解决方案 »
- 共享软件,用盗版delphi开发的,会不会被找麻烦
- 哪种对数据库表的封装更好?
- 请教 用sql语句查询某一表当中最后20条记录怎么写??
- WEBSNAP中的权限级别问题
- 一个关于FileListBox的问题。
- 在win2k中如何实现aip函数对win2k进行关机与restart??
- 大家看看偶能拿多少??
- Query为何删除不掉Dbase数据库中的记录?代码如下
- Delphi 现有的控件好象处理不了大数据库啊
- 请问各位大虾:BDE方式进行连断数据库是同步的还是异步的?不胜感激!!!!
- 请问哪能下载到DELPHI6的“英文版” ??? 专业或企业均可(最好是企业版)
- 关于用COM OBJECT制作DLL的问题。
现在要在第一遍把这个数组赋初值为1至1 2 8,第二遍将此数组赋初值为1 2 8至2 5 5,
然后结果显示在列表框中。要用两个线程来分别进行初始化。
源码如下:
//////////////////////////////////////////////////////////////////
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;type
TMainForm = class(TForm)
Button1: TButton;
ListBox1: TListBox;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
procedure ThreadsDone(Sender: TObject);
{ Private declarations }
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;
CS : TRTLCriticalSection;function GetNextNumber: Integer;
begin
Result := NextNumber; // return global var
Inc(NextNumber); //inc global var
end;procedure TMainForm.Button1Click(Sender: TObject);
begin
initializeCriticalSection(CS);
TFooThread.Create(False); //create threads
TFooThread.Create(False);
end;{ TFOOThread }procedure TFOOThread.Execute;
var
i: Integer;
begin
OnTerminate := MainForm.ThreadsDone;
EnterCriticalSection(CS);
for i := 1 to MaxSize do
begin
GlobalArray[i] := GetNextNumber; //set array element
Sleep(5); //这句话干什么?
end;
LeaveCriticalSection(CS);
end;
procedure TMainForm.ThreadsDone(Sender: TObject);
var
i : Integer;
begin
inc(DoneFlags);
if DoneFlags = 2 then //make sure both threads finished
for i := 1 to MaxSize do
{fill listbox with array contents}
ListBox1.Items.Add(IntToStr(GlobalArray[i]));
DeleteCriticalSection(CS);
end;procedure TMainForm.Button2Click(Sender: TObject);
begin
Button2.caption := IntToStr(GetNextNumber);
MainForm.Caption:=IntToStr(ListBox1.Items.Count);
end;end.
就是告诉cpu当前不要为他分配时间片,这样其他的线程就有机会执行了
因为一共有三个线程(包括主进程),由于你使用了临界区,代码区实际的执行线程只会有一个,呵呵。《delphi开发人员指南》11章中讲得很详细,可以参考一下
我就是在《delphi开发人员指南》11章中
看不懂才来这里问