其实这个问题有线程,句柄两方面,自己不清楚,有代码,希望朋友帮我看看,指点一下 ( 积分: 100 )

  • 主题发起人 asksomeone
  • 开始时间
A

asksomeone

Unregistered / Unconfirmed
GUEST, unregistred user!
const
WM_netthDone=wm_user+203;
type
Netthread = class(TThread) {网络连接线程}
private
Fhandle:HWND;
procedure changcolor;
protected
procedure Execute;
override;
public
constructor Create(CreateSuspended: Boolean;AHandle:HWND);
destructor Destroy;override;
end;

private
procedure NetthDone(var Message:TMessage);message WM_netthDone;
{上面是摘出来的}
{调用IdIcmp的ping方法查看网络是否正常}
Function net_Ping(IpAddress:String):Boolean;
begin
try
f_main.IdICMP.ReceiveTimeout := 500;
f_main.IdICMP.Host := IpAddress;
f_main.IdICMP.Ping;
{调用方法Ping;}
Application.ProcessMessages;
case f_main.IdICMP.ReplyStatus.ReplyStatusType of
rsTimeout:Result:=False;
else
Result:=True;
end;
finally end;
{异常处理 }
end;


{监测网络状态线程开始}
constructor netthread.Create(CreateSuspended:boolean;AHandle:HWND);
begin
inherited Create(CreateSuspended);{false是指构造的同时即唤醒}
FreeOnTerminate := True;
FHandle:=AHandle;
Resume;
end;

destructor netThread.Destroy;
begin
inherited;
end;

procedure netThread.changcolor;
var
icoindex:integer;
begin
f_main.reconn.Caption:='连接正常';
f_main.reconn.ShowHint:=false;
Randomize;
icoindex:=random(2);
f_main.ImageList1.GetIcon(icoindex,f_main.Image1.Picture.icon);
Screen.Cursor := CrDefault;
end;

procedure netThread.Execute;
begin
if (self.terminated)then
exit;
try
Synchronize(changcolor);
PostMessage(FHandle,WM_netthDone, Self.ThreadID,0);
closehandle(fhandle);********************************
except
on E:Exceptiondo
begin
PostMessage(FHandle,WM_netthDone, Self.ThreadID,MaxInt);
closehandle(fhandle);********************************
end;
end;
end;

procedure Tf_main.netthDone(var Message:TMessage);
begin
if message.msg=wm_netthDone then
begin

netthen
d:=true;{标识一个线程的结束}
end;
end;

procedure TF_main.Timer3Timer(Sender: TObject);
begin
if(Net_Ping('222.35.22.78')=true) and(flagx=0)and(netthen
d=true) then
begin
netthen
d:=false;{线程开始标识为false}
Netthread.Create(true,f_main.Handle);
end;
end;
我想问带*****的地方释放传入的句柄
1、需不需要?
2、方法对不对?是用closehandle(),还是用freeandnil()方法对?
3、(重要的,我最关心的)还有没有漏洞,就是是不是有句柄没有被释放完?(如果释放完了,但我的程序里面内存没问题线程也没变化,就是句柄数再增加)
大哥们,小弟急盼回贴!在线等
 
不是太懂,先帮你顶顶。看看其他发言。
 
{监测网络状态线程开始} //觉得下面需要修改一下, 你并没有预先知道CreateSuspended 是传什么值进来! 比如是false 呢! 你说会出现什么问题啊!!
constructor netthread.Create(CreateSuspended:boolean;AHandle:HWND);
begin
inherited Create(CreateSuspended);{false是指构造的同时即唤醒}
FreeOnTerminate := True;
FHandle:=AHandle;
Resume;
end;
//应该修改为:
constructor netthread.Create(CreateSuspended:boolean;AHandle:HWND);
begin
FreeOnTerminate := True;
FHandle:=AHandle;
inherited Create(CreateSuspended);{false是指构造的同时即唤醒}
if CreateSuspended then
Resume;
end;
//其他的没有仔细看,先说这个吧 ^_^
 
//你下面这段代码只执行一次就结束了, 不知道是不是你的本意
//FHandle 是个窗口句柄吧! 要不然怎么接收消息啊! 那么就不要closehandle(fhandle);
//这个FHandle由创建他的对象管理就可以了
procedure netThread.Execute;
begin
if (self.terminated)then
exit;
try
Synchronize(changcolor);
PostMessage(FHandle,WM_netthDone, Self.ThreadID,0);
closehandle(fhandle);********************************
except
on E:Exceptiondo
begin
PostMessage(FHandle,WM_netthDone, Self.ThreadID,MaxInt);
closehandle(fhandle);********************************
end;
end;
end;
 
procedure TF_main.Timer3Timer(Sender: TObject);
才看见你是在这里做线程创建的! 呵呵. 不知道你这样做为什么要写一个线程干什么啊!
 
谢谢kk2000,是应该有个判断,我先改了再说
是这样子的,我觉得线程如果长时间运行,可能会出问题,或者死掉,那样不太好控制
于是我就想让一个定时器,定时地建一个线程并写一个标识,线程执行完就结束,并释放再写一下标识证明结束了,可以重建了,然后就再进行下一个周期的动作,只用timer的话,觉得界面有时候会假死,用线程后好多了
 
不能沉了啊,当次讨论,还不中吗?
 
我的服务程序的线程连续运行N个月了, 没有发现死过啊! 呵呵
 
我的程序中不止一个这样的线程,都是动态创建后又退出,然后再重建,因为是客户端程序,怕死掉后,客户不理解
 
再浮一天,大家帮帮忙
 
难道又被无情地淹没了,呜呜~~
 
好了,结贴发分
 
顶部