idtcpserver 多线程同步问题

方法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;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值