Multithreading 编辑哪些更改我的策略?
我正在一个多线程服务器上工作,该服务器带有用于维护系统的VCL表单。 每个线程都可以在MainForm的RichEdit上进行写入,以实时显示它的功能(如果出现问题,我们必须快速修复) 但是,当一个线程写入RichEdit时,我会不时收到一个“EOutOfResource”错误:“Erreur d'insertion de ligne RichEdit”(谷歌翻译:错误插入行RichEdit)。RichEdit内容变得一团糟 这是在RichEdit上添加行的主要表单过程:Multithreading 编辑哪些更改我的策略?,multithreading,delphi,richedit,eoutofresources,Multithreading,Delphi,Richedit,Eoutofresources,我正在一个多线程服务器上工作,该服务器带有用于维护系统的VCL表单。 每个线程都可以在MainForm的RichEdit上进行写入,以实时显示它的功能(如果出现问题,我们必须快速修复) 但是,当一个线程写入RichEdit时,我会不时收到一个“EOutOfResource”错误:“Erreur d'insertion de ligne RichEdit”(谷歌翻译:错误插入行RichEdit)。RichEdit内容变得一团糟 这是在RichEdit上添加行的主要表单过程: procedure M
procedure Main.MajRichEdit(S1,S2:string;tform:TFontStyles;i1:integer)
begin
CriticalSection.Acquire
if S2='C' then
begin
RichEditC.SelAttributes.Style:=tform;
RichEditC.SelAttributes.Color:=i1;
RichEditC.Lines.Add:=S1;
end
else if S2='CN' then
RichEditC.Lines.Add:=S1;
else if S2='T' then
begin
RichEditT.SelAttributes.Style:=tform;
RichEditT.SelAttributes.Color:=i1;
RichEditT.Lines.Add:=S1;
end
else if S2='TN' then
RichEditT.Lines.Add:=S1;
else if S2='S' then
begin
RichEditS.SelAttributes.Style:=tform;
RichEditS.SelAttributes.Color:=i1;
RichEditS.Lines.Add:=S1;
end
else if S2='SN' then
RichEditS.Lines.Add:=S1;
CriticalSection.Release;
end;
以下是来自我的线程的调用:
//..Declaration Variable..//
public
sCall1,sCall2:string;
tFontCall1:TFontStyles;
iNbColor1:integer;
//..Appel MajRichEdit..//
procedure Mythread.CallREMajTelforIHM;
begin
LockIHM.BeginWrite;
Main.MajRichEdit(sCall1,sCall2,tFontCall1,iNbColor1);
LockIHM.EndWrite;
end;
//..Appel CallRe ..//
//My code
sCall1:="un petit peu de français , c'est pas plus mal ;) "
sCall2:="C";
tFontCall1:=[fsBold]; //If i want a txt in bold ;)
iCall1:=clRed;
Queue(CallREMajTelforIHM);
我有类似的东西可以很好地工作(只是一件小事,但我会在以后修复它;)
可以通过try/except绕过异常?我在我的系统中没有做任何改变,因此我不明白为什么要修改TRichEdit策略…不完全确定您试图在这里实现什么,但我肯定会在您的关键部分使用
Try..Finally
。查找,谢谢您,这是一次尝试,这是真的,但另一件事给警察和颜色带来了问题:“procedure Mythread.CallREMajTelforIHM;开始LockIHM.BeginWrite;Main.MajRichEdit(scal1、scal2、tFontCall1、iNbColor1);LockIHM.EndWrite;结束;'我必须删除LockIHm,这没关系;)但我不明白为什么?如果有人知道^^请更改同步队列。你的过程会被调用,天知道什么时候,然后它会从另一个线程访问这些内部成员变量-它们可能已经被更改,也可能被你的工作线程使用,如果你可以更改策略,我建议你将所有数据打包到一个匿名过程中,并通过主VCL线程队列或使同步或者使用OmniThreadLibrary并通过队列将数据传递到主窗体,让主窗体处理粗体字体和字符串常量,然后suchI清理了语言,但无法通过一个复杂的“策略”理解您的意思。也许是字体?