程序可以正常运行,只是界面象死掉一样。不知道问题出在哪里?
Type
TMonitorThread=Class(TThread)
Private
FTerminal: string; //设备名称
FIndex: Integer; //设备在TreeView中的位置
FConnected: Boolean;//连接标识
procedure MonitorStatus;
Protected
procedure Execute;Override;
public
Constructor Create(Suspended:Boolean; terminal:string; connected:Boolean; index: Integer );
End;
constructor TMonitorThread.Create(Suspended:Boolean; terminal:string; connected:Boolean; index: Integer);
begin
inherited Create(Suspended);
FTerminal:=terminal;
FIndex:=index;
FConnected:=false;
FreeOnTerminate:=True;
end;procedure TMonitorThread.MonitorStatus;
var
api: ILogicAPI; //调用WebService的接口
cmdstr: WideString;
psa: PSafeArray;
pt: Pointer;
sRes: WideString;
begin
cmdstr:='state@display@Display@'+FTerminal;
api:=CreateComObject(CLASS_LogicAPI_) as ILogicAPI;
psa:=api.Unitecommand(cmdstr);
if psa=nil then
begin
FrmMain.UpdateTerminalImage(Findex,4);
FConnected:=False;
end
else
begin
SafeArrayAccessData(psa,pt);
sRes:=TWideStringArray(pt)[0];
if (sRes='1') and (FConnected=True) then
begin
FrmMain.UpdateTerminalImage(Findex,3);
FConnected:=True;
end else
if (sRes='1') and (FConnected=False) then
begin
cmdstr:='show@display@Display@'+FTerminal+'@'+FTerminal;
iapi.Unitecommand(cmdstr);
FrmMain.UpdateTerminalImage(Findex,3);
FConnected:=True;
end;
SafeArrayUnAccessData(psa);
end;
end;procedure TMonitorThread.Execute;
begin
while not terminated do
begin
Sleep(10);
Synchronize(MonitorStatus);
end;
end;procedure TFrmMain.cbbRFIDServerChange(Sender: TObject);
var
i: Integer;
begin
for i:=0 to tvServer.Items.Count-1 do
begin
if not tvServer.Items[i].HasChildren then
begin
TMonitorThread.Create(False,tvServer.Items[i].Text,false,i);
end;
end;
end;
Type
TMonitorThread=Class(TThread)
Private
FTerminal: string; //设备名称
FIndex: Integer; //设备在TreeView中的位置
FConnected: Boolean;//连接标识
procedure MonitorStatus;
Protected
procedure Execute;Override;
public
Constructor Create(Suspended:Boolean; terminal:string; connected:Boolean; index: Integer );
End;
constructor TMonitorThread.Create(Suspended:Boolean; terminal:string; connected:Boolean; index: Integer);
begin
inherited Create(Suspended);
FTerminal:=terminal;
FIndex:=index;
FConnected:=false;
FreeOnTerminate:=True;
end;procedure TMonitorThread.MonitorStatus;
var
api: ILogicAPI; //调用WebService的接口
cmdstr: WideString;
psa: PSafeArray;
pt: Pointer;
sRes: WideString;
begin
cmdstr:='state@display@Display@'+FTerminal;
api:=CreateComObject(CLASS_LogicAPI_) as ILogicAPI;
psa:=api.Unitecommand(cmdstr);
if psa=nil then
begin
FrmMain.UpdateTerminalImage(Findex,4);
FConnected:=False;
end
else
begin
SafeArrayAccessData(psa,pt);
sRes:=TWideStringArray(pt)[0];
if (sRes='1') and (FConnected=True) then
begin
FrmMain.UpdateTerminalImage(Findex,3);
FConnected:=True;
end else
if (sRes='1') and (FConnected=False) then
begin
cmdstr:='show@display@Display@'+FTerminal+'@'+FTerminal;
iapi.Unitecommand(cmdstr);
FrmMain.UpdateTerminalImage(Findex,3);
FConnected:=True;
end;
SafeArrayUnAccessData(psa);
end;
end;procedure TMonitorThread.Execute;
begin
while not terminated do
begin
Sleep(10);
Synchronize(MonitorStatus);
end;
end;procedure TFrmMain.cbbRFIDServerChange(Sender: TObject);
var
i: Integer;
begin
for i:=0 to tvServer.Items.Count-1 do
begin
if not tvServer.Items[i].HasChildren then
begin
TMonitorThread.Create(False,tvServer.Items[i].Text,false,i);
end;
end;
end;
解决方案 »
- Dll调用能够返回执行结果,但提示invalid pointer operation错误
- 请教:File Map Handle与File Handle有什么区别!
- 菜鸟重提:初学Dephi:一个类的the_item属性表示什么?
- 怎样活的stringGrid控件中单元的值??
- 如何得到某个特定文件夹下的文件的个数?
- 怎么安.pas形式的组件
- 使用delphi,进入Oracle数据库查询数据,日期控件
- 介绍不错的一个Delphi站点 http://www.wolfsoft.nugoo.com/ 站名:黄昏狼制作室
- 急!急!急!!!DELPHI 中的SQL 错误: error creating cursor handle
- 硬盘作为虚拟光驱,必须要为他单独分一个区做虚拟光驱吗??硬盘只有一个分区如何做虚拟光驱??
- ADO插入数据的问题,在线等,解决完即给分,谢谢!
- 关于combobox.selstart的问题
建议楼主试试以下方法,
1,在更新控件后,使用Application.ProcessMessages方法,在使用Sleep方法,应该有所改观的;
2,在线程中,不适用循环,改用一次循环一个线程,可以使用临界区,来同步这些线程
try
FCriticalSection.Enter;
finally
FCriticalSection.Leave;
end;
这种写法是有问题的当Enter失败的时候仍然会执行Leave.
procedure onRead(Sender: TObject; Socket: TCustomWinSocket);
for i:=0 to lv1.Items.Count-1 do
begin
clientSocket:= TclientSocket.Create(nil);
try
clientSocket.Address:='127.0.0.1';
clientSocket.Port:=7081;
clientSocket.ClientType:=ctNonBlocking;
clientSocket.OnRead:=onRead;
clientSocket.Active:=True;
ClientSocket.Socket.SendBuf(tempvar[0],Length(pc));
finally
clientSocket.Free;
end;
end;