idtcpserver 多线程同步问题

来源:互联网 发布:新网域名转出申请 编辑:程序博客网 时间:2024/05/17 22:24
方法1:临界区……

Delphi/Pascal code?

//全局的
FLockUI: TCriticalSection;//临界区还有一个TRTLCriticalSection,区别?俺不清楚。反正找个短的来用吧。

//改写文本
function WriteTxt(Msg: string): Boolean;
begin
// .....把接收的数据写入文本的一些程序......
//if 某些条件 then
// result := true
//else
// result := false;
end;

procedure TIndexForm.IdTCPServerExecute(AContext: TIdContext);
var IsWrite:Boolean;
ReadString:String;
begin
ReadString:=AContext.Connection.IOHandler.ReadLn;
FLockUI.Enter;//考虑容错的话,还可以加入TRY
//这里还可以修改一些控件内容,不如MEMO等;
Memo.Lines.Add(ReadString);
IsWrite := WriteTxt();
if IsWrite then
Client.Context.Connection.IOHandler.WriteLn('1')
else
Client.Context.Connection.IOHandler.WriteLn('0');
FLockUI.Leave;
end;

第2中方法:传说中的TIdSync.SynchronizeMethod();
对此方法,我了解不深。但某些人说,这不是同步的东西。而且,这东西没有返回值,调用的必须是个过程,没返回值。所以,只能做个全局变量。比如;

Delphi/Pascal code?

//全局的
FLockUI: TCriticalSection; //临界区该用还得用。
RecStr:String; //接收到的数据
WriteResult:Boolean; //把接收的数据写入文本的结果

procedure WriteText();
begin
WriteResult:=false;//让全局的变量为FALSE,默认是写入失败。
// .....把接收的数据写入文本的一些程序......
//if 是否写入成功的条件 then
// WriteResult := true
//else
// WriteResult := false;
end;

procedure TIndexForm.IdTCPServerExecute(AContext: TIdContext);
begin
FLockUI.Enter;
//把接收的数据防盗全局变量中
RecStr:=AContext.Connection.IOHandler.ReadLn;
//这里还可以修改一些控件内容,不如MEMO等;
Memo.Lines.Add(ReadString);
//委托到主线程中执行
TIdSync.SynchronizeMethod(WriteText);
if WriteResult then
Client.Context.Connection.IOHandler.WriteLn('1')
else
Client.Context.Connection.IOHandler.WriteLn('0');
FLockUI.Leave;
end;
原创粉丝点击