我用idftp做上传的时候发现程序过一段时间就会死掉,调试发现程序在下面这个while中陷入死循环
function TIdSimpleServer.Listen: Boolean;
begin
//TODO: Add a timeout to this function.
Result := False;
if not FListening then begin
BeginListen;
end;
with Binding do begin
if FAbortedRequested = False then
begin
while (FAbortedRequested = False) and (Result = False) do begin
Result := Readable(AcceptWait);
end;
end;
if Result then begin
Binding.Listen(1);
Binding.Accept(binding.Handle);
end;
GStack.WSCloseSocket(ListenHandle);
FListenHandle := Id_INVALID_SOCKET;
end;
end;
就是
while (FAbortedRequested = False) and (Result = False) do begin Result := ReadableAcceptWait);这句跳不出去
请教各位高手可能是什么原因造成的,有什么方法解决?多谢
function TIdSimpleServer.Listen: Boolean;
begin
//TODO: Add a timeout to this function.
Result := False;
if not FListening then begin
BeginListen;
end;
with Binding do begin
if FAbortedRequested = False then
begin
while (FAbortedRequested = False) and (Result = False) do begin
Result := Readable(AcceptWait);
end;
end;
if Result then begin
Binding.Listen(1);
Binding.Accept(binding.Handle);
end;
GStack.WSCloseSocket(ListenHandle);
FListenHandle := Id_INVALID_SOCKET;
end;
end;
就是
while (FAbortedRequested = False) and (Result = False) do begin Result := ReadableAcceptWait);这句跳不出去
请教各位高手可能是什么原因造成的,有什么方法解决?多谢
解决方案 »
- delphi中定义了系统热键能否控制热键
- How ? Delphi7通过SERVICE组件启动IE并自动登陆论坛?
- >>---------------关于窗体关闭的问题?------------------------------
- 尚未调用CoInitialize的错误怎么恢复?
- 这个简单的聊天室程序,编译是出错~!!~?
- 求教字符串转化问题
- 我已经在TWebBrowser的PopupMenu里加入了我自己的PopupMenu事件,当然里面什么也没写,但是点击鼠标右键还是有快捷菜单出来为什么啊?
- 征求意见,我有一个ADSL上网计时程序,我想公开源代码并且遵循GNU规则!觉得支持的请进来说一下!
- 怎么获取常量的名字?第一个正确回答者给全部分!
- 请教一个delphi OCX的字符兼容性问题
- 奇怪。。如何获取标题栏的文字
- 限制小数点后面位数该怎么写?
没有退出请求 and 不监听解决方法不知道,没见过。
我感觉我这里的网络状况还是不错的
Result := False;1,开始的时候你就对她付了 False ,保证能进行循环。这个跟操作系统里,设计的很多东西一样。2,while (FAbortedRequested = False) and (Result = False) do begin
Result := Readable(AcceptWait);
end;循环里面可以将 Result 变为 True, 说明监听事件完成。Readable(AcceptWait); 返回以只读方式的 为 True 。
有可能能读这个文件了,就不要监听了。我想你的流程,你自己更清楚。
还有下面那句Result := Select(0, @FDRead, @FDWrite, @FDError, @tmTO);为什么调试的时候进不去select函数?
function TIdStackWindows.WSSelect(ARead, AWrite, AErrors: TList; ATimeout: Integer): Integer;
var
tmTo: TTimeVal;
FDRead, FDWrite, FDError: TFDSet; procedure GetFDSet(AList: TList; var ASet: TFDSet);
var
i: Integer;
begin
if assigned( AList ) then begin
AList.Clear; // SG 18/10/00: ALWAYS clear the result list
AList.Capacity := ASet.fd_count;
for i := 0 to ASet.fd_count - 1 do begin
AList.Add(TObject(ASet.fd_array[i]));
end;
end;
end; procedure SetFDSet(AList: TList; var ASet: TFDSet);
var
i: integer;
begin
if AList <> nil then begin
if AList.Count > FD_SETSIZE then begin
raise EIdStackSetSizeExceeded.Create(RSSetSizeExceeded);
end;
for i := 0 to AList.Count - 1 do begin
ASet.fd_array[i] := TIdStackSocketHandle(AList[i]);
end;
ASet.fd_count := AList.Count;
end;
end;begin
FillChar(FDRead, SizeOf(FDRead), 0);
FillChar(FDWrite, SizeOf(FDWrite), 0);
FillChar(FDError, SizeOf(FDError), 0);
SetFDSet(ARead, FDRead);
SetFDSet(AWrite, FDWrite);
SetFDSet(AErrors, FDError);
if ATimeout = IdTimeoutInfinite then begin
Result := Select(0, @FDRead, @FDWrite, @FDError, nil);
end else begin
tmTo.tv_sec := ATimeout div 1000;
tmTo.tv_usec := (ATimeout mod 1000) * 1000;
Result := Select(0, @FDRead, @FDWrite, @FDError, @tmTO);
end;
GetFDSet(ARead, FDRead);
GetFDSet(AWrite, FDWrite);
GetFDSet(AErrors, FDError);
end;