新手请教大家,关于 Sleep()问题的(100分)

  • 主题发起人 主题发起人 smallpig8191981
  • 开始时间 开始时间
S

smallpig8191981

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在有一个监控程序,包括一大一小两个监控窗口。当我输入一个IP地址,会分别在大小两个窗口监控这个IP地址的计算机,主要代码如下:
procedure TMainForm.citConnectClick(Sender: TObject);
var
AHost: string;
AViewerIndex: Integer;
begin
InputQuery('Remote Host:', 'Please enter your session Host:', AHost);

if Trim(AHost) <> '' then begin
AViewerIndex := StrToInt(Copy((pmSmallViewer.PopupComponent as TTeLabel).Name,
Length((pmSmallViewer.PopupComponent as TTeLabel).Name), 1));
SetViewerConnect(AViewerIndex, AHost, True);//调用小窗口显示函数
if AviewerIndex-1 = SmallViewerIndex then
SmallViewerIndex:=-1;
//SmallViewerIndex是大窗口显示内容说对应的小窗口号码
[red] Sleep(50);[/red]
SetMasterViewer(pmSmallViewer.PopupComponent);//调用大窗口显示函数

end;

end;

但是,当我在程序中加入[red] Sleep(50);[/red]的话,小窗口不显示,或者显示的图像不完整,但是大窗口完整显示图像

当我不加入 [red]Sleep(50);[/red]的时候,则小窗口正常显示,大窗口却不显示出来

望各位指教。。。。。。。。。
 
这个应该是程序无法响应窗口的刷新消息,加入[red] Sleep(50);[/red]的话,你可以把小窗口update刷新一下
 
REFRESH;
APPLICATION.PROCESSMESSAGE;
 
不要用SLEEP,自己写一个延时的函数如下:
procedure SysDelay(aMs: Longint);
var
TickCount : LongInt;
begin
TickCount:=GetTickCount;
while GetTickCount - TickCount < aMs do Application.ProcessMessages;
end;
其中参数是毫秒。
 
恩。。。不知道你那个SetViewerConnect和SetMasterViewer的实现过程如何
不过我猜想可能是单独开了个线程来执行,而且用到了一些公共开关变量之类的,造成了在显示的时候产生冲突

你把那2个方法的内容贴出来看看
 
各位不好意思,放假上不了网,现在才能回帖
To 大唐电信:请问如何UPDATE?本人是新手。。。不懂。。。。见笑了。。。

To yinghao2002:你的代码应该放在哪里??插进哪个地方??

To weiliu:首先谢谢你的代码,我现在先去试试看
 
小窗体显示的时候update下
 
To:hs-kill 以下就是 SetViewerConnect和SetMasterViewer的实现代码

procedure TMainForm.SetViewerConnect(ViewerIndex: Integer; Host: string; isSmallViewer:Boolean);
var
i, j: Integer;
begin
if Host = GetLocalIP then begin //GetLocalIP获取本地IP地址函数
MessageBox(0, 'Sorry,can not monitor yourself.', PChar(Application.Title),
MB_OK + MB_ICONSTOP + MB_TOPMOST);
Exit;
end;

if isSmallViewer then begin
//isSmallViewer判断此监控窗口是否已经在小窗口监控中

//如果在显示屏幕中已经存在,并且不是再次生成,则不继续添加
j := isShowInSmallViewer(Host);
if (j > 0) and (ViewerIndex <> j) then begin
MessageBox(0, Pchar('This host is monitored in viewer' +
IntToStr(j)), PChar(Application.Title), MB_OK + MB_ICONINFORMATION + MB_DEFBUTTON2
+ MB_TOPMOST);
Exit;
end;

for i := 0 to Length(AVNCViewer) - 1 do begin
//AVNCViewer显示客户端的小窗体数组
if i = ViewerIndex - 1 then begin
SetViewerSize(AVNCViewer);
AVNCViewer.Parent := ASmallViewer;
if AVNCViewer.Visible = False then
AVNCViewer.Visible := True;

AVNCViewer.Stop;
AVNCViewer.Disconnect;
AVNCViewer.RelayKeys := False;
AVNCViewer.RelayMouse := False;

AVNCViewer.Connect(Host, 5990);

AViewerHosts := Host; //记录用户Host

Break;
end;
end;
end
else begin
Self.MasterViewer.Stop;
Self.MasterViewer.Disconnect;
SetViewerSize(MasterViewer);
Self.MasterViewer.Visible := True;

Self.MasterViewer.RelayKeys := False;
Self.MasterViewer.RelayMouse := False;

Self.MasterViewer.BackColor := clWhite;
Self.MasterViewer.Connect(Host, 5990);
end;

end;



/////////////////////////////////////////////////////////////////////

procedure TMainForm.SetMasterViewer(Sender: TObject);
var
i: Integer;
begin
for i := 0 to Length(AVNCViewer) - 1 do //AVNCViewer显示客户端的小窗体数组
//如果是选中的小屏幕
if i = StrToInt(Copy((Sender as TTeLabel).Name, Length((Sender as TTeLabel).Name), 1)) - 1 then begin
if i = SmallViewerIndex then //如果是正在显示的
//SmallViewerIndex是大窗口显示内容说对应的小窗口号码
Exit;
//ASmallViewer: array of TTeHeaderPanel; 显示客户端的小窗体数组
ASmallViewer.Font.Color := clRed;
if AVNCViewer.IsConnected then begin
MainHost := AViewerHosts;
SmallViewerIndex := i;
SetFixImage(AVNCViewer, ASmallViewer);
SetViewerConnect(0, AViewerHosts, False);
Self.lblHeadMasterViewer.Tag := i;
end;
end
else begin
if (AViewerHosts <> '') and (not AVNCViewer.IsConnected) then
SetViewerConnect(i + 1, AViewerHosts, True);
ASmallViewer.Font.Color := clBlack;
end;
end;
 
-_-!。。。。抱歉 没看懂。。。代码好乱的说。。。

你先把sleep注释掉
然后在SetViewerConnect的下一句设个断点,看看会不会出现大窗口显示,小窗口显示不全的现象

如果有,那基本就是线程和冲突的问题了
如果没有,检查你2个方法里互相引用的部分,单步跟踪下试试
 
to:hs-kill
-_-!,在下严重新手。。。。我在这里(if AviewerIndex-1 = SmallViewerIndex then)设置了一个breakpoint,发现小窗口显示正常。。。。。大窗口没有显示。。。

请问。。。该如何继续单步跟踪。。。。。。。。。
 
晕。。。。。。。。。。。。重新打开程序,再次在同一地方插入 breakpoint,这次却发现大窗口显示正常。。。。。。。小窗口不显示。。。。。。。。。。
 
问题已经解决了,方法是 继续用 SLEEP函数

然后在sleep函数与SetMasterViewer()函数之间插入 “weiliu”大虾所写的延迟函数


小弟感谢各位大虾的关心与帮助,谢谢各位
 
多人接受答案了。
 
后退
顶部