线程单元代码如下:
type
TProcessCom =class(TThread)
private
sSocket:TCustomWinSocket;
lstItem:TListItem;
sComm:Byte;
sString:AnsiString;
pStrList, pStrList2:TStringList;
SocketData: TSocketData;
protected
procedure Execute; override;
procedure DOSynJob;
Public
constructor Create(FSocket:TCustomWinsocket;FComm:Byte;FString:AnsiString);
destructor Destroy; override;
end;implementation
uses UnitMain;constructor TProcessCom.Create(FSocket:TCustomWinsocket;FComm:Byte;FString:AnsiString);
begin
inherited Create(False);
sSocket:=FSocket;
sComm:=FComm;
sString:=FString;
FreeOnTerminate:=True;
Suspended:=False;
end;destructor TProcessCom.Destroy;
begin
inherited Destroy;
end;Function Explode(sDelimiter: string; sSource: String): TStringList;
Var
c: Word;
Begin
Result := TStringList.Create;
C := 0;
While sSource <> '' Do
Begin
If Pos(sDelimiter, sSource) > 0 Then
Begin
Result.Add(Copy(sSource, 1, Pos(sDelimiter, sSource) - 1 ));
Delete(sSource, 1, Length(Result[c]) + Length(sDelimiter));
End
Else
Begin
Result.Add(sSource);
sSource := ''
End;
Inc(c);
End;
End;procedure TProcessCom.Execute;
var
lstTemp:TListItem;
begin
if sSocket.Data = nil then begin
SocketData := TSocketData.Create;
sSocket.Data := SocketData;
end;
case sComm of
PACK_AUTH:
begin
pStrList := Explode('|',sString);
if pStrList.Count <> 7 then begin
FormMain.DisconnectSocket(sSocket);
exit;
end else begin
Synchronize(dosynJob);
end;
end;
end;
if pStrList<>nil then pStrList.Free;end;procedure TProcessCom.DOSynJob;
var
IpAddr:AnsiString;
begin
IpAddr:=GetIPtoAdder(sSocket.RemoteAddress);
lstItem:=FrameOnlineServer.OnlineLV.Items.Add;// 访问VCL就出错
lstItem.Caption:=sSocket.RemoteAddress;
lstItem.SubItems.Add(string(IpAddr));
lstItem.SubItems.Add(pStrList[1]);
lstItem.SubItems.Add(pStrList[8]);
lstItem.SubItems.Add(pStrList[2]);
lstItem.SubItems.Add(pStrList[3]);
lstItem.SubItems.Add(pStrList[4]);
lstItem.SubItems.Add(pStrList[0]);
lstItem.SubItems.Add('test');
lstItem.SubItemImages[2]:=GetFlag(pStrList[8]);
lstItem.SubItems.Objects[0]:=sSocket;
lstItem.ImageIndex:=143;
lstItem.OverlayIndex:=137;
AddLog('添加主机成功: ' + sSocket.RemoteAddress,clBlue);
TSocketData(sSocket.Data).lstConnectionItem := lstitem;
TSocketData(sSocket.Data).sUserPath := pStrList.Strings[1];
TSocketData(sSocket.Data).sRemoteHost := sSocket.RemoteAddress;
CountConnections;
end;end.
FrameOnlineServer在出窗体创建的时候就Create了,线程调用是在socket的Onread事件里面 TProcessCom.Create(Socket,bByte,tempStr);
调试的时候看到数据传递时没有出错的,本来这一个单元不是线程,就是直接往FrameOnlineServer添加数据,不会出错。
可我想改成线程来处理Socket接收到的数据,不知道哪里出错了,新手学delphi,各位大牛帮忙看看。
type
TProcessCom =class(TThread)
private
sSocket:TCustomWinSocket;
lstItem:TListItem;
sComm:Byte;
sString:AnsiString;
pStrList, pStrList2:TStringList;
SocketData: TSocketData;
protected
procedure Execute; override;
procedure DOSynJob;
Public
constructor Create(FSocket:TCustomWinsocket;FComm:Byte;FString:AnsiString);
destructor Destroy; override;
end;implementation
uses UnitMain;constructor TProcessCom.Create(FSocket:TCustomWinsocket;FComm:Byte;FString:AnsiString);
begin
inherited Create(False);
sSocket:=FSocket;
sComm:=FComm;
sString:=FString;
FreeOnTerminate:=True;
Suspended:=False;
end;destructor TProcessCom.Destroy;
begin
inherited Destroy;
end;Function Explode(sDelimiter: string; sSource: String): TStringList;
Var
c: Word;
Begin
Result := TStringList.Create;
C := 0;
While sSource <> '' Do
Begin
If Pos(sDelimiter, sSource) > 0 Then
Begin
Result.Add(Copy(sSource, 1, Pos(sDelimiter, sSource) - 1 ));
Delete(sSource, 1, Length(Result[c]) + Length(sDelimiter));
End
Else
Begin
Result.Add(sSource);
sSource := ''
End;
Inc(c);
End;
End;procedure TProcessCom.Execute;
var
lstTemp:TListItem;
begin
if sSocket.Data = nil then begin
SocketData := TSocketData.Create;
sSocket.Data := SocketData;
end;
case sComm of
PACK_AUTH:
begin
pStrList := Explode('|',sString);
if pStrList.Count <> 7 then begin
FormMain.DisconnectSocket(sSocket);
exit;
end else begin
Synchronize(dosynJob);
end;
end;
end;
if pStrList<>nil then pStrList.Free;end;procedure TProcessCom.DOSynJob;
var
IpAddr:AnsiString;
begin
IpAddr:=GetIPtoAdder(sSocket.RemoteAddress);
lstItem:=FrameOnlineServer.OnlineLV.Items.Add;// 访问VCL就出错
lstItem.Caption:=sSocket.RemoteAddress;
lstItem.SubItems.Add(string(IpAddr));
lstItem.SubItems.Add(pStrList[1]);
lstItem.SubItems.Add(pStrList[8]);
lstItem.SubItems.Add(pStrList[2]);
lstItem.SubItems.Add(pStrList[3]);
lstItem.SubItems.Add(pStrList[4]);
lstItem.SubItems.Add(pStrList[0]);
lstItem.SubItems.Add('test');
lstItem.SubItemImages[2]:=GetFlag(pStrList[8]);
lstItem.SubItems.Objects[0]:=sSocket;
lstItem.ImageIndex:=143;
lstItem.OverlayIndex:=137;
AddLog('添加主机成功: ' + sSocket.RemoteAddress,clBlue);
TSocketData(sSocket.Data).lstConnectionItem := lstitem;
TSocketData(sSocket.Data).sUserPath := pStrList.Strings[1];
TSocketData(sSocket.Data).sRemoteHost := sSocket.RemoteAddress;
CountConnections;
end;end.
FrameOnlineServer在出窗体创建的时候就Create了,线程调用是在socket的Onread事件里面 TProcessCom.Create(Socket,bByte,tempStr);
调试的时候看到数据传递时没有出错的,本来这一个单元不是线程,就是直接往FrameOnlineServer添加数据,不会出错。
可我想改成线程来处理Socket接收到的数据,不知道哪里出错了,新手学delphi,各位大牛帮忙看看。
解决方案 »
- 如何根据CheckListBox中的值定位一个GroupBox(包含两个单选按钮)的位置
- 如何得到一个动态生成的Active控键的handle??????急急急!!!!
- 在fastreport中如何判断一个memo中含有回车呢?
- 使用WebBrowser做浏览器遇到iframe的问题
- 伤心失望,再问一次
- delphi7从入门到精通这本书翻得怎么样?
- 用Delphi可否自制像InstallShield樣的程序
- 关于继承的问题
- 用Delphi 5做的一套程序编译后EXE文件有12M,怎样才能小点?
- 我是新手帮帮忙,我会加分给你的
- imagelist+listview的VSICON模式,图标颜色问题
- 注册系统热键是否一定要添加全局原子
我用线程一般是用TStringList或着TList,然后MainForm的OnIdle事件读列表数据就行了
我的线程调用是在ServerSocket的Onread事件里面 TProcessCom.Create(Socket,bByte,tempStr),我设想的目的就是减轻ServerSocket的负担(不知道对不对),楼上sz_haitao大牛说“使用了Synchronize,访问vcl应该只会慢”是否有理论上的依据,如果确实如此,那我这么做岂不是画蛇添足了,另外,我还是想知道我的代码哪里出错了。
FormMain.Caption:='test';//这里并没有出错
lstItem:=FrameOnlineServer.OnlineLV.Items.Add; //这里访问就出错了我尝试访问主窗体,发现并没报错,为什么访问其他Frame就出错了。
程序代码没错,错就错在同步事件里面的lstItem:=FrameOnlineServer.OnlineLV.Items.Add; 提示访问出错