怎么检测不到线程挂起,高分求答(200分)

  • 主题发起人 主题发起人 wang_cai1
  • 开始时间 开始时间
W

wang_cai1

Unregistered / Unconfirmed
GUEST, unregistred user!
constructor QueryThread.create(ww: string);
begin
CoInitialize(nil);
try
inherited Create(true);
con := TADOConnection.Create(nil);
with condo
begin
LoginPrompt := False;
ConnectionString := ww;
// con.Connected := true;
end;
udp_c := TIdUDPClient.Create(nil);
sp_info := TADOStoredProc.Create(nil);
with sp_infodo
begin
Connection := con;
ProcedureName := 'get_targer_user;1';
CursorLocation := clUseServer;
end;
finally
CoUnInitialize;
end;
self.FreeOnTerminate := False;
end;

destructor QueryThread.Destroy;
begin
con.Free;
sp_info.Free;
CoUnInitialize;
inherited Destroy;
end;

procedure QueryThread.Execute;
begin
try
FillChar(R_msg, sizeof(R_msg), #0);
Tdata.Read(R_msg, sizeof(R_msg));
except
Exit;
end;
rpl := '';
C_Acc := R_msg.Name;
ww_ip := BBinding.PeerIP;
ww_port := BBinding.PeerPort;
if R_msg.Mtype = info then
begin
con.Connected := True;
p_info := R_msg.Info;
p_name := R_msg.Oper;
sp_info.Prepared := True;
sp_info.Parameters.Clear;
sp_info.Parameters.CreateParameter('@MSISDNP', ftFloat, pdInput, 0, StrToFloat(p_info));
sp_info.Parameters.CreateParameter('@IPADDR', ftstring, pdInput, 15, ww_ip);
sp_info.Parameters.CreateParameter('@RESULT', ftstring, pdOutput, 200, '');
try
sp_info.ExecProc;
rpl := sp_info.Parameters.ParamValues['@result'];
rpl_content := rpl;
udp_c.Send(ww_ip, ww_port, rpl_content);
Synchronize(send);
sp_info.Close;
con.Connected := False;
except
Exit;
end;
Self.Suspend;
while not Self.Suspendeddo
begin
Application.ProcessMessages;
end;
Exit;
end;
end;

procedure TServerF.Server1UDPRead(Sender: TObject;
AData: TStream;
ABinding: TIdSocketHandle);
var i: Integer;
begin
for i := 1 to 5do
begin
Application.ProcessMessages;
if query.Suspended then
//接收数据后,检测是否有挂起的线程
begin
query.Tdata := AData;
query.BBinding := ABinding;
Label3.Caption := IntToStr(i);
query.Resume;
Break;
end;
end;
end;
当UDP接收到数据后,i值不断增加,检测不到挂起的线程,i=5后线程将不工作,不知道怎么回事,请各位帮忙看一下
 
几点不明白
1:query 是你的线程吗?一共几个,Break会不会有问题。
2: ...
except
Exit;
end;
Self.Suspend;
while not Self.Suspendeddo
begin
Application.ProcessMessages;
end;
Exit;
Exit之后线程就不执行了,为何要加Application.ProcessMessages,辅助线程不会影响主线程处理消息。
 
你的线程只执行了一次就退出了,应该加循环代码:
while not Terminateddo
begin
//...
end;
 
to nicai_wgl
query是在程序启动时创建的线程数组,加Break主要是在找到一个执行结束挂起的线程来执行Resume,关键是线程执行后不能挂起,不知道是什么原因.

to godelphi2004
我的线程执行后没有销毁而是挂起了,所以没有检测是否Terminated.
 
呵呵,说了你怎么还搞不明白啊。。。你自己的程序你自己都看不懂啊?
你不是在外面还有个Server1UDPRead过程啊,那里面不是调用了Resume方法?
好你原来挂起的线程执行这个方法后跑到哪里去了?执行完了!!!
 
to godelphi2004
while not Terminateddo
begin
end
加在什么地方,加在执行体中还是Server1UDPRead过程中,Execute后,我不是将线程挂起了吗?
 
如果你不想销毁,只想挂起的话,在Execute中使用死循环:
while Truedo
begin
....
if Terminated then
break;
....
end;
 
wwr74:
线程Execute执行结束后,线程为什么没有挂起(在Server1UDPRead过程中循环检测的结果表明),我不怕它销毁,我创建时即定义为程序挂起.
 
procedure TServerF.Server1UDPRead(Sender: TObject;
AData: TStream;
ABinding: TIdSocketHandle);
var i: Integer;
begin
//在这里加上循环
while not Terminateddo
begin
for i := 1 to 5do
begin
Application.ProcessMessages;
if query.Suspended then
//接收数据后,检测是否有挂起的线程
begin
query.Tdata := AData;
query.BBinding := ABinding;
Label3.Caption := IntToStr(i);
query.Resume;
Break;
end;
end;
end;
end;
 
to all
我的代码想实现这样一个功能,程序启动时间创建10个线程,放入线程数组,并挂起,当UDP收到一个数据后,调用一个挂起的线程到数据库中查询数据,并将返回数据发送给客户端,纯种结束后自动将自己挂起。
 
Server1UDPRead本来就是类似于线程的Excute.
 
procedure QueryThread.Execute写的有问题,这样写
procedure QueryThread.Execute;
begin
While not Terminateddo
begin
你的查询数据代码;
Suspend ;
end ;
end ;
还有,不要在线程中使用Application.ProcessMessages
 
帮顶!
http://www.source520.com
站长开发推广同盟 站长朋友的终极驿站
同时拥有海量源码电子经典书籍下载
http://www.source520.com/search/search.asp
"编程.站长"论坛搜索引擎-----为中国站长注入动力!
 
TThread的源代码有Bug,主要就是线程是否挂起的判断上面,开始我也遇到问题,后来自己在线程中加入代码解决的,加个标志变量就可以了。
其实tthread如果按默认的情况创建线程,也就是create(True),之后再Resume,Suspended就是正确的了。
 
后退
顶部