问个网络编程的问题!(5分)

  • 主题发起人 主题发起人 mill666
  • 开始时间 开始时间
M

mill666

Unregistered / Unconfirmed
GUEST, unregistred user!
想写一个socket 的服务端程序,要求有个窗口界面(而不是dos的哟),界面上有个按钮可以开启服务或者关闭服务,最重要的是要有一个GRID控件,可以显示出每个客户端请求送上来的相关信息,这样是不是很酷;当然这个服务端应当能同时处理多个客户端连接。

所以俺就想到用线程技术(Thread 了),一个客户端请求开启一个线程。
关键的问题是:要是同时有多个客户端连接,那么对这个GRID控件就有多个线程同时对其操作了,那么这些线程需要进行同步处理吗?
我看delphi有关书,说线程对VCL进行处理的时候需要同步,不知道说的是不是这个意思。

请大侠们指教。谢了先!!!!
 
先自己找找资料了,估计DFW现在没有多少人在认真回答问题了。我也是碰到这问题,不过正在自己找资料。
 
可以用下 indy组件 带例子的
 
VCL不支持线程同步,可以在线程里用同步函数,或用postMessage发送消信给主线程处
理。
同步函数很简单,
PostMessage要在窗口上拦截消息。
如:
const
WM_SOKCETREAD = WM_USER + $F02; //数据到来


WM_TransWorking = WM_USER + $F03; //传输文件工作消息
WM_AddTransFile = WM_USER + $F04; //添加一个传输文件消息
WM_TransTimeOut = WM_USER + $F05; //传输文件超时消息
WM_TransDelete = WM_USER + $F06; //删除一个传输文件消息
WM_TransComplete = WM_USER + $F07; //一个传输文件完成消息
WM_BufferUpFile = WM_USER + $F08; //一个上传文件缓冲完成消息

procedure SocketReadData(var Message: TMessage); message WM_SOKCETREAD;


procedure Tfrm_ClientCtrlPanel.ReadReply(Socket: TCustomSocket;
AData: TStream; var AReply: TStream; var DataType: TSocketDataType);
var
l_Cmd, A_Cmd: word;
l_data: string;
Data: TStream;
begin
if AData.Size = 0 then Exit;
try
//取得命令头
AData.Read(l_Cmd, SizeOf(l_Cmd));
case l_Cmd of
CPP_StartCaptureScr: begin
GetCaptureScreen(AData);
end;
MSG_TEST: begin
Self.UpdateLog('MSG_TEST');
end;
CPP_LOGOUT: ;
MSG_DATA:
begin
Data := TMemoryStream.Create;
Data.CopyFrom(AData, AData.Size - AData.Position);
//发送线程同步消息
PostMessage(Handle, WM_SOKCETREAD, 0, Longint(Data));
end;
else UpdateLog(GetConstName(l_Cmd), True);
end;
except
end;
end;


procedure Tfrm_ClientCtrlPanel.SocketReadData(var Message: TMessage);
begin
if TStream(Message.LParam) <> nil then
DealDataBag(TStream(Message.LParam));
end;
 
后退
顶部