Multithreading 编辑哪些更改我的策略?

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

我正在一个多线程服务器上工作,该服务器带有用于维护系统的VCL表单。 每个线程都可以在MainForm的RichEdit上进行写入,以实时显示它的功能(如果出现问题,我们必须快速修复)

但是,当一个线程写入RichEdit时,我会不时收到一个“EOutOfResource”错误:“Erreur d'insertion de ligne RichEdit”(谷歌翻译:错误插入行RichEdit)。RichEdit内容变得一团糟

这是在RichEdit上添加行的主要表单过程:

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清理了语言,但无法通过一个复杂的“策略”理解您的意思。也许是字体?