请教各位:关于线程的两个问题!多谢了!
以下是我自己写的MyThread.pas ,运行时出现了两个问题:
1.程序执行到Synchronize(InitEdit);就停在此处不动作了!
2.若把Synchronize(InitEdit);注释掉,则界面上的Edit内容没有任何改变。
请各位告知,先谢了!
unit MyThread;//MyThread.pas
interface
uses
Windows, SysUtils,Classes,StdCtrls,Dialogs;
type
TMyThread = class(TThread)
private
{ Private declarations }
ED:TEdit;
procedure InitEdit; //初始化Edit
procedure UpdateEdit; //修改Edit
protected
procedure Execute; override;
published
constructor CreateIt(ED:TEdit);
destructor Destroy;override;
end;
implementation
constructor TMyThread.CreateIt(ED:TEdit);
begin
inherited Create(false);
FreeOnTerminate := true;
Synchronize(InitEdit);-------1.执行到此句出错,程序停在此处不动作了!
Suspended:=false;
end;
//--------------------------------------------------------------------
procedure TMyThread.InitEdit; //初始化Edit
begin
ED.Text:='';
end;
//--------------------------------------------------------------------
procedure TMyThread.UpdateEdit; //修改Edit
var CostTime:integer;
StartTicker,EndTicker:integer;
i,j:integer;
begin
StartTicker := GetTickCount;
i:=0;
for i:=0 to 1000 do
begin
CostTime:=GetTickCount-StartTicker;
ED.Text:=IntToStr(CostTime);------2.此处出错!
//为何界面上的Edit1的内容没有任何改变?
end;
end;
//--------------------------------------------------------------------
procedure TMyThread.Execute;
begin
Synchronize(UpdateEdit);
end;
//--------------------------------------------------------------------
destructor TMyThread.Destroy;
begin
PostMessage(Form1.Handle,wm_ThreadDoneMsg,self.ThreadID,0);
inherited destroy;
end;
end.
问题点数:0、回复次数:5Top
1 楼hellolongbin(一个人(自从扩充话题改版,再也不去灌水乐园了))回复于 2004-12-03 10:01:22 得分 0
你的Ed是动态创建的还是别的窗体上的?如果是其他窗体上的直接操作当然不行ED.Text:=IntToStr(CostTime);Top
2 楼chenyf2006()回复于 2004-12-03 10:20:54 得分 0
是别的窗体上的,那么如何改呢?Top
3 楼chenyf2006()回复于 2004-12-08 08:57:39 得分 0
各位高手,帮帮忙吧!先谢了!Top
4 楼zeroxing(胸无半点墨,腰有万贯财;此般理想高,怎奈做不到!)回复于 2004-12-08 09:15:21 得分 0
我看你的意思,是在CreateIt的时候,把ED传到线程里面来,但是你在CreateIt构建过程里面,完全就不理会ED的传入。而你在InitEdit里面用到的ED则是一个没有创建的TEdit的对象变量而已,你当然会出错。在这里,对象的成员变量和过程的局部参数变量,我想你是搞混淆了。在CreateIt里面增加一句:Self.Ed := ED;差不多就应该可以了。
还有就是,你的这个线程其实没有什么用,所有的操作都放在Synchronize里面进行,也就是说都是附着在主线程里面进行的,这就和单线程没有任何的差别,这样的话,就不必要用多线程来去做了。Top
5 楼chenyf2006()回复于 2004-12-08 10:38:48 得分 0
谢谢 hellolongbin(一个人) 和zeroxing(光头)的回答 !!!
TO zeroxing(光头) :按你的提示我修改了变量ED,也试过Self.Ed := ED,
程序还是停在Synchronize(InitEdit);就不动作了,请再帮我看看吧!谢谢!
type
TMyThread = class(TThread)
private
{ Private declarations }
ED_T:TEdit;*********增加了对象的成员变量**********
procedure InitEdit
procedure UpdateEdit;
protected
procedure Execute; override;
published
constructor CreateIt(ED:TEdit);***过程的局部参数变量保持不变***
destructor Destroy;override;
end;
implementation
uses Unit_TwoThread;
//------------------------------------------------------------------------------
constructor TMyThread.CreateIt(ED:TEdit);
var a1:String;
begin
inherited Create(true);
FreeOnTerminate := true;
a1 := ED.Text;---------------当程序执行到此处,a1='Edit1';说明参数传递成功了。
ED_T := ED;
Synchronize(InitEdit););-----但执行到此句,程序仍停在此处不动作了!
Suspended:=false;
end;
//------------------------------------------------------------------------------
procedure TMyThread.InitEdit; //初始化Edit
begin
ED_T.Text := '11';
end;Top
相关问题
- 急死我了!串口读写和多线程的几个问题,千万帮忙阿!菜鸟多谢各位,感激涕零!!
- 各位大虾:请问在VB中如何使用多线程?(可以调用其它语言(如VC)写的DLL),高分送上,多谢!!!
- 救救小弟!delphi 下的clint/sever和多线程、对硬件的控制应该怎么弄啊!多谢各位大虾!
- 关于线程的一个小问题,多谢!
- 线程两问
- 多线程 请教各位
- 多线程中,如何在主线程和其他线程中公用StringList,这个stringList如何传入到其他子线程中?多谢!!
- 两个非常菜的问题,希望各位帮忙回答一下,多谢!!
- 各位高手,小弟有两个问题想问。多谢解答!
- 各位大虾,谁有WinRunner的下载连接?多谢!多谢!




