以下的程序完全摘自delphi5开发人员指南的多线程章节。我也是刚开始看多线程的内容,还请各位高手指导下小弟。。 多谢多谢啊
看了下面短短的程序有3个问题,问题1和问题2标在程序里了
问题3:多线程的临界区是不是只能用在用一个线程类多个不同对象之间的。对于两个线程类的各自的子线程之间是不需要考虑同步问题的??
验证一个整数数组,现在第一遍把这个数组赋初值为1到128,第二遍将这个数组赋初值为128到255,然后显示在列表框中。这里用两个线程分别进行初始化。
unit main;
interface
uses
windows,messages,sysutils,classes,graphics,controls,forms,dialogs,stdctrls;
type
Tmainform = class(Tfrom)
button1: Tbutton
listbox1:Tlistbox
procedure button1click(sender: Tobject);
private
procedure threadsdone(sender: Tobject);
end;
var
Mainfrom: TMainform;
implementation
const
MaxSize= 128;
var
nextnumber: integer=0;
doneflages:integer=0;
globalarray:array[1..maxsize] of integer;
function getnextnumber: integer;
begin
resule :=Nextnumber; //return global var
Inc(nextnumber); //inc global var
end;
procedure Tfoothread.execute;
var
i: integer
begin
onterminate := mainform.threadsdone; //问题1,这是什么意思啊??
for i:= 1 to maxsize do
begin
globalarray[i] := getnextnumber; //set array element
sleep(5);
end;
end;
procedure Tmainform.threaddone(sender: Tobject);
var
i: integer;
begin
inc(doneflags);
if doneflag = 2 then //make sure both threads finished
//问题2,为什么doneflag=2的时候表示两个线程都结束了
begin
for i:= 1 to maxsize do
{fill listbox with array contents}
listbox1.items.add(inttostr(globalarray[i]));
end;
procedure Tmainform.button1click(sender: Tobject);
begin
Tfoothread.create(false); //create threads;
Tfoothread.create(false);
end;
end.
看了下面短短的程序有3个问题,问题1和问题2标在程序里了
问题3:多线程的临界区是不是只能用在用一个线程类多个不同对象之间的。对于两个线程类的各自的子线程之间是不需要考虑同步问题的??
验证一个整数数组,现在第一遍把这个数组赋初值为1到128,第二遍将这个数组赋初值为128到255,然后显示在列表框中。这里用两个线程分别进行初始化。
unit main;
interface
uses
windows,messages,sysutils,classes,graphics,controls,forms,dialogs,stdctrls;
type
Tmainform = class(Tfrom)
button1: Tbutton
listbox1:Tlistbox
procedure button1click(sender: Tobject);
private
procedure threadsdone(sender: Tobject);
end;
var
Mainfrom: TMainform;
implementation
const
MaxSize= 128;
var
nextnumber: integer=0;
doneflages:integer=0;
globalarray:array[1..maxsize] of integer;
function getnextnumber: integer;
begin
resule :=Nextnumber; //return global var
Inc(nextnumber); //inc global var
end;
procedure Tfoothread.execute;
var
i: integer
begin
onterminate := mainform.threadsdone; //问题1,这是什么意思啊??
for i:= 1 to maxsize do
begin
globalarray[i] := getnextnumber; //set array element
sleep(5);
end;
end;
procedure Tmainform.threaddone(sender: Tobject);
var
i: integer;
begin
inc(doneflags);
if doneflag = 2 then //make sure both threads finished
//问题2,为什么doneflag=2的时候表示两个线程都结束了
begin
for i:= 1 to maxsize do
{fill listbox with array contents}
listbox1.items.add(inttostr(globalarray[i]));
end;
procedure Tmainform.button1click(sender: Tobject);
begin
Tfoothread.create(false); //create threads;
Tfoothread.create(false);
end;
end.
解决方案 »
- 如何设置TreeView中Node之间的间距?
- 如何计算两个时间的时间差
- aiirii(ari)请来拿分(其他同志请勿回)
- 双枪将(精通Delphi和VC++的)---请: 《如何在Delphi中实现VC中的Doc/View(文档-视图)架构》
- 视频采集卡(远程监控)的选择
- 帮忙找错误!
- 在自己的软件里面怎么实行Code Complete功能啊!
- 为什么dbgrid用QUERY 做数据源没masterdatasource属性?
- 学Delphi有一段时间了,但进步太慢,苦恼中.........
- 谁能告诉我用什么方法把一个Client端由Client传给Server端,然后由Server端保存在本机上!不能用FTP!50分一定给!
- 热烈庆祝香港回归七周年,有奖问答,大家都进来看看啊,up有分!!!!
- StringGrid这个破东西可不可以隐藏指定的某列使其不显示出来?
本线程的OnTerminate(结束事件,在 MainForm中 的 threadsdone 中处理)>> //问题2,为什么doneflag=2的时候表示两个线程都结束了
在本例子中,运行两个线程,两个结束时都会调用
procedure Tmainform.threaddone(sender: Tobject);
这个过程,而每调用一次,就
inc(doneflags); //增加计数 1
也就是,第二个线程结束时,就会满足调用if doneflag = 2 then
....
3。设置临界区就是为了 某一时刻 资源只能被一个线程访问
对于两个线程类之间是同样的道理