请教,IdTcpServer多线程时,线程同步的讨论

 我来答
huanglenzhi
2016-01-03 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数:117538 获赞数:517189
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。

向TA提问 私信TA
展开全部
方法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;
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式