1

このライブラリをスレッドで動作させようとしていますが、syncronize を使用して結果をメイン スレッドに戻すことができません。

execute メソッド内で xml を作成しても問題ありません。

使ったことある人いますか?


   TMyThread = class(TThread)
       private
       ADoc : TNativeXml;
        protected
         procedure Execute; override;
         procedure DoProgress;
       public
         constructor Create(CreateSuspended: Boolean);
      end;

    { TMyThread }

    constructor TMyThread.Create(CreateSuspended: Boolean);
    begin
      inherited;
    end;

procedure TMyThread.DoProgress;
begin
 formMain.meminfo.Lines.Add(ADoc.WriteToString);
end;

procedure TMyThread.Execute;
var i,j : integer;
begin
  inherited;
begin
    ADoc:= ADoc.Create(formMain);
    try
    Adoc.XmlFormat := xfReadable;
    ADoc.LoadFromFile('test.xml');
    Synchronize(DoProgress);
    finally 
       FreeAndNil(ADoc);
    end;
end;
end; 
4

1 に答える 1

8

この行でメインスレッドに結果が返されないか、アクセス違反が発生しますか?

ADoc:= ADoc.Create(formMain);

そのコードの 1 行には、1 つのバグと 1 つのコードの匂いが含まれています。コードの匂いはformMain、スレッドから参照しているということです。バグは.Create()、クラス名ではなく、変数名自体を呼び出していることです! あなたはおそらく望んでいた:

ADoc := TNativeXml.Create(nil);
于 2011-04-12T12:25:59.003 に答える