请问为什么下面线程的excute并没有执行?(15分)

Y

ychy

Unregistered / Unconfirmed
GUEST, unregistred user!
请问为什么下面线程的excute并没有执行?
SgFilter:=TSgFilter.create (mainform.Handle,listbox10);
能够进入到线程里面,但却调用不了excute。
unit TSingleFilterThread;
interface
uses
Classes ,StrUtils,Dialogs,Extctrls,Windows,Messages,Winsock,stdctrls,Gauges,Sysutils,
IdFTP,IdComponent,FtpCli, Psock, IdTCPConnection, IdTCPClient , IdBaseComponent,IdIntercept;
const
MAXCOUNT=300;
WM_FilterConnectSuccess=wm_user+25;
wm_FilterTryConnect=wm_user+26;
WM_Filterallok=wm_user+27;
WM_FilterConnectFail=wm_user+28;
type
TSingleFilter = class(TThread)
private
{ Private declarations }
protected
wparent:HWND;
ftp:Tidftp;
mylistbox:TListbox;
procedure Execute;
override;
public
constructor create(sparent:HWND;Listbox:Tlistbox);
end;
var
TFilterFile:TextFile;
implementation
uses unit1;

constructor TSingleFilter.create (sparent:HWND;listbox:Tlistbox);
begin

inherited Create(true);
Freeonterminate:=true;
mylistbox:=listbox;
wparent:=sparent;
resume;
end;

procedure TSingleFilter.Execute ;
var
wrongnumber,i:integer;
ftpip,wrong:ANsiString;
begin

Ftp:=Tidftp.Create(nil);
AssignFile(TFilterFile,'FilterFile.txt');
Rewrite(TFilterFile);

ftp.User :='anonymous' ;
ftp.Password :='anonymous@21cn.com';
ftp.Port :=21;
for i:=0 to mylistbox.Count - 1do
begin
if ftp.Connected then
ftp.Disconnect ;
ftpip:=mylistbox.Items;
ftp.Host :=ftpip;
try
begin
sendmessage(wparent,wm_FiltertryConnect,integer(pchar(ftpip)),0);
FTP.Connect;
sendmessage(wparent,wm_FilterConnectSuccess,integer(pchar(ftpip)),0);
writeLn(TFilterFile,'1',',',ftpip,',','1',',','0');
end;
except
On E:Exceptiondo
begin
wrong:=e.Message ;
sendmessage(wparent,wm_FilterConnectFail,integer(pchar(ftpip+' 连接失败,因为: ' +wrong)),0);
try
wrongNumber:=strtoint(copy(wrong,1,3));
except
wrongnumber:=1;
end;
WriteLn(TFilterFile,'1',',',ftpip,',','0',',',wrongnumber);
end;
end;
end;

ftp.Free ;
closeFile(TFilterFile);
sendmessage(wparent,wm_Filterallok,0,0);
end;

end.
 
我在调试中发现excute并没有执行。?
 
constructor TSingleFilter.create (sparent:HWND;listbox:Tlistbox);
begin

inherited Create(true);
//这里如果要创建后立刻执行应该改为False, 否则创建后需要调用Resume方法
Freeonterminate:=true;
mylistbox:=listbox;
wparent:=sparent;
resume;
//不能在这里调用, 因为这时对象还没有完全构造
end;
 
不会吧,别的线程是没问题的啊
 
constructor TSingleFilter.create (sparent:HWND;listbox:Tlistbox);
begin

inherited Create(true);

Freeonterminate:=true;
mylistbox:=listbox;
wparent:=sparent;
resume;

end;
这段代码没有任何问题
 
你怎么知道这个线程没有运行了?
 
我用断点调试,发现不执行。
 
不会把,你即使不用这个IDFTP我想也应该执行,看看你的程序是不是有什么地方有
逻辑问题
 
不同意楼上的, 你这里没有出现问题是偶然的....呵呵, 同样错误在几年前已经让我
吃过苦头了...
 
你在Create()的时候,CreateThread函数已经启动了,只是没有运行,
你给他的成员变量赋值以后再用resume;
启动他的运行,这没有什么
不队。
 
TO tseug:
原闻其详!!!希望指点指点,
 
我发现一个很奇怪的现象。
我是在主窗口接收到一个消息,才启动这个线程的。
结果发现,该线程启动了,但不会执行excute。
所以我就把启动线程的代码放在一个button的click上。
主窗口接收到消息后,就启动button的click事件。
结果线程的excute就能运行了,真奇怪。
大家解析一个。
 
你把create方法换个名字用CreateSpy()之类的试,没办法,多试试点怪招
这种现象的确很奇怪,我在一个线程里启动其他线程都是和上面差不多的代码
都没有问题,
 
[h4]>结果发现,该线程启动了,但不会执行excute。
ychy:线程实际上就是excute中的那段代码[/h4]
 
TThread类只是封装了CreateThread()函数,当你调用Create()方法的时候,这个线程
已经建立了,不信你可以看VCL代码,只是他的一些属性是默认的,如果没有调用resume,
或者开始的时候传进去的是TRUE参数,他是挂起的,和TThread类是否创建完成没有任何
关系!
 
你把线程的类声明换成下面的形式试一试:
TSingleFilter = class(TThread)
private
{ Private declarations }
protected
wparent:TWinControl;
ftp:Tidftp;
mylistbox:TListbox;
procedure Execute;
override;
public
constructor create(sparent:TWinControl;var Listbox:Tlistbox);
end;
 
顶部