请教,IdTcpServer多线程时,线程同步的讨论
1个回答
2016-01-03 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
向TA提问 私信TA
知道合伙人数码行家
采纳数: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;
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;
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询