if Terminated then ..错误及线程同步问题(50分)

  • 主题发起人 主题发起人 Liyue
  • 开始时间 开始时间
L

Liyue

Unregistered / Unconfirmed
GUEST, unregistred user!
请大虾帮助修改以下多线程例子,谢谢!:
主要问题:
1."if Terminated then
..." 语句似乎没有什么语法问题,但运行时总是出错。为什么?
2.线程运行结束后,会运行一个过程"UUU".这样,当两个线程刚好“同时”结束时,就会同时调用"UUU",引起程序运行结果的变化。怎样改进?
unit Unit1;
interface
uses
UnitBncThred,Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Edit4: TEdit;
Edit5: TEdit;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Edit6: TEdit;
Edit7: TEdit;
procedure Button1Click(Sender: TObject);
procedure uuu(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
i,W:integer;
n:array[1..2] of integer;
p:array[1..2] of mythread;
e:array[1..10] of tedit;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
n[1]:=0;n[2]:=0;
e[1]:=edit1;e[2]:=edit2;e[3]:=edit3;e[4]:=edit4;
e[5]:=edit5;e[6]:=edit6;e[7]:=edit7;
for i:=1 to 2do
begin
w:=5*i;n:=n+1;
e[2+i].text:=inttostr(w);
e[4+i].text:=inttostr(n);
e[7].text:=inttostr(n[1]+n[2]);
p:=myThread.Create(False,e,w);
p.onterminate:=uuu;
end;
end;
procedure TForm1.uuu(Sender: TObject);
//当两个线程刚好同时调用UUU过程时,会发生混乱。怎么改进?//
begin
if n[1]+n[2]>8 then
exit;
for i:=1 to 2do
if p.Terminated then
begin
//运行时显示"未说明标示符:'terminated'",难道terminated不是delphi的保留字吗?!或者我的delphi5有问题!?//
n:=n+1;
e[4+i].text:=inttostr(n);
e[7].text:=inttostr(n[1]+n[2]);
p:=myThread.Create(False,e,w);
p.onterminate:=uuu;
end;
end;
end.

unit UnitBncThred;
interface
Uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
AppEvnts, StdCtrls, ExtCtrls;
Type
mythread=Class(TThread)
Private
aedit:Tedit;
p:integer;
a:Integer;
b:Integer;
Procedure disloop;
Protected
procedure Execute;Override;
public
Constructor Create(Suspended:Boolean;edit:Tedit;p:integer);
end;
implementation
Procedure mythread.disloop;
begin
aedit.text:=inttostr(b);
end;
Procedure myThRead.execute;
var
i:integer;
begin
for i:=1 to ado
begin
b:=i;
synchronize(disloop);
sleep(1000);
if TerMinated then
exit;
end;
end;
Constructor mythread.Create(Suspended:Boolean;edit:Tedit;p: integer);
begin
inherited Create(Suspended);
aedit:=edit;
a:=p;
FreeOnTerminate:=True;
end;
end.
 
SOS!敬请大虾关注。谢谢!
 
创建线程:createThread(参数),把UUU过程调用,详细资料查看DELPHI HELP。
或者DELPHI4。0编程技术内幕中有详细介绍。
 
具体怎样操作?
"if Terminated then
..." 不是很正确的语句吗?为什么总是出错。
为什么!?怎样改?
是不是我的delphi系统有问题?那位大哥帮助运行验证一下以上程序,
这厢有礼了!
编程令人满足、憔悴、疯狂。
 
线程之间的同步可以用事件(EVENT),你可以参考一下CreateEvent、SetEvent以及ResetEvent等API函数的说明。
结束现程可以用ExitThread,它带有一个返回值,可以说明线程退出时的状态。
。。。。
 
谢谢黄豆!能否送个例程?我是初级。谢谢!
 
我的水平也一般般,没有什么象样的例程。
另外,在等待事件时,一般是用WaitForSingleObject?或者WaitForMultipleObject。
 
那个terminated可以这样测试一下,打完了.等一会儿,如果出现了提示,
那你就没错,如果没出现的话,那就肯定有毛病了,而且这个毛病可能很
傻的,好好看看。
进入uuu的时候使用信号灯技术就可以了,或者使用critical section,
这个东西的作用是一个线程再做一件事的时候,不会被打断,直到做完为止。
用这个关键字查一下帮助,能找到一些资料。
 
Lczhuhuo大虾,看了你的简历,水平很高。您能否详细谈谈?
我的问题是:
当一个线程thread1运行结束后,赋予新的初值,再启动该线程。既
procedure TForm1.Button1Click(Sender: TObject);
begin
thread1:=myThread.Create(False,e[1],1);
if thread1.Terminated then
uuu;
end;

procedure uuu(Sender: TObject);
begin
i:=i+1;
thread1:=myThread.Create(False,e,i);
if thread1.Terminated then
uuu;
end;

我已经花了三天时间研究,一直找不到解决方法,头都大了。如果这个问题不解决,
下一步的编程工作无法开展,拜托了。waiting。
 
运行时,到语句 “if thread1.Terminated then
uuu;”
就出现错误:“未说明标示符:'terminated'”,程序退出。
难道Terminated保留字需要声明吗?怎样声明?
 
terminated是个protected的属性,没有存取权限的,当然是undeclared!
其余的问题一会儿看不懂,嘿嘿,工作呢,得偷偷的!
 
不过我觉得你的问题似乎可以用tthread.waitfor来解决,看看waitfor的帮助,
它就是直到结束了才返回一个值。例如下面的语句:
procedure TForm1.Button1Click(Sender: TObject);
begin
thread1:=myThread.Create(False,e[1],1);
thread1.waitfor
uuu;
end;

procedure uuu(Sender: TObject);
begin
i:=i+1;
thread1:=myThread.Create(False,e,i);
thread1.waitfor
uuu;
end;

不过在unit1中这样写并不好,这样容易导致form1没有响应。
 
以下是一个空壳程序,unit2是delphi5自动生成的一个空的线程。
unit1是只有一个按妞的空程序,当运行到
“if Terminated then
” 时,显示错误信息:
“未说明标示符Terminated ”,程序退出。
请那位大虾帮助在您的delphi5下测试运行一下,验证
是否我的delphi5有质量问题?拜托了!拜托了!!
线程 q
unit Unit2;
interface
uses
Classes;
type
q = class(TThread)
private
{ Private declarations }
protected
procedure Execute;
override;
public
Constructor Create(Suspended:Boolean);
end;
implementation
{ q }
procedure q.Execute;
begin
{ Place thread code here }
end;
Constructor q.Create(Suspended:Boolean);
begin
inherited Create(Suspended);
FreeOnTerminate:=True;
end;
end.

主程序:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,Unit2;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
q.Create(false);
if Terminated then
;//显示错误信息:“未说明标示符Terminated ”//
end;
end.

 
lczhuohuo大虾:
“terminated是个protected的属性,”高!!
听君一句话,胜读三天书。谢谢!
就是说,terminated只能用在线程内部?
 
谢谢lczhuohuo!
如果同时创建两个线程呢?例如下例,运行i:=i+1时似乎有个同步问题。
procedure TForm1.Button1Click(Sender: TObject);
begin
thread1:=myThread.Create(False,e[1],1);
thread1.waitfor a:='1';uuu;

thread2:=myThread.Create(False,e[2],2);
thread1.waitfor a:='2';uuu
end;

procedure uuu(Sender: TObject);
begin
i:=i+1;
if a='1' then
begin
thread1:=myThread.Create(False,e,i);
thread1.waitfor a:='1';
uuu;
end;
if a='2' then
begin
thread2:=myThread.Create(False,e,i);
thread2.waitfor a:='2';
uuu;
end;
end;

 

Similar threads

I
回复
0
查看
654
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
529
import
I
后退
顶部