procedure TIniThread.Execute;
var
i: integer;
begin
OnTerminate := MainForm.ThreadsDone;
for i := 1 to MaxSize do
begin
GlobalArray[i] := GetNextNum;
Sleep(5);
end;
end;procedure TMainForm.Button1Click(Sender: TObject);
begin
TIniThread.Create(false);
TIniThread.Create(false);
end;procedure TMainForm.ThreadsDone(Sender: TObject);
var
i: integer;
begin
Inc(DoneFlags);
if DoneFlags = 2 then
for i := 1 to MaxSize do
ListBox1.Items.Add(IntToStr(GlobalArray[i]));
end;
end.
一:Button1Click生成2个线程后,Execute是不是自动调用?
二:OnTerminate := MainForm.ThreadsDone。OnTerminate 是一个事件,怎么好负值呢?线程到底是用什么来判断该现成结束?
三:ThreadsDone线程结束后处理怎么调用他的?
var
i: integer;
begin
OnTerminate := MainForm.ThreadsDone;
for i := 1 to MaxSize do
begin
GlobalArray[i] := GetNextNum;
Sleep(5);
end;
end;procedure TMainForm.Button1Click(Sender: TObject);
begin
TIniThread.Create(false);
TIniThread.Create(false);
end;procedure TMainForm.ThreadsDone(Sender: TObject);
var
i: integer;
begin
Inc(DoneFlags);
if DoneFlags = 2 then
for i := 1 to MaxSize do
ListBox1.Items.Add(IntToStr(GlobalArray[i]));
end;
end.
一:Button1Click生成2个线程后,Execute是不是自动调用?
二:OnTerminate := MainForm.ThreadsDone。OnTerminate 是一个事件,怎么好负值呢?线程到底是用什么来判断该现成结束?
三:ThreadsDone线程结束后处理怎么调用他的?
解决方案 »
- delhi7中webbrowser关闭对话框
- 在線高分求助﹕delphi6 設置lookupcache為true時﹐發生末知錯誤﹔設為false時﹐lookup類型數據不能顯示
- DbgridEh排序问题
- 上帝,我只是想写个树,难道不行吗
- 怎么把光标定位在我要找的记录上(如在Dbgrid上)?
- 用adotable直接连接数据库出现的问题
- delphi里如何将word文档存入MSSQL数据库里,有怎样调出来啊?
- 谁有短信sms.dll调用次数无限制版
- 哪有TfcStatusBar下载?急等
- 如何在 SQL 中实现一个 FOR......DO 的循环????
- 如何修改控制面板中的日期格式为'yyyy-mm-dd'?
- 局域网中如何截取数据分包??
OnTerminate是一个可控制属性,可以在主线程中进行赋值
当线程检测到这个属性为FLASE的时候终止执行
ThreadsDone检测到如果两个线程都执行完毕后把结果列入LISTBOX
偶也是初学线程,也许狗屁不通,呵呵,错了别怪
2. OnTerminate是一个事件句柄,当线程结束后就调用这个句柄指向的代码,要线程结束的方法是调用线程的Terminate方法,但这个方法并不强制结束线程,它实际上是把一个保护的成员变量Terminated设置为True,你在线程的Execute方法中应该经常检查这个变量,如果为True就要自己结束线程,只要你退出Execute方法线程就结束了。像你这个例子Execute方法并没有检查Terminated变量,所以只能等到循环结束后才能结束线程
3. 这个就是你前面OnTerminate := MainForm.ThreadsDone这句起的作用啊,Thread会在线程结束后就调用这个OnTerminate指向的代码,你这里就指向MainForm.ThreadsDone
另外这句最好放在主线程设置,因为涉及到线程安全的问题,在线程类里面不要访问mainform,同时为了能够有机会设置你在创建线程时候应该用TIniThread.Create(True);设置完后再调用resume方法启动线程