2011-04-12 34 views
1

我嘗試讓這個庫與線程一起工作,但我無法使用syncronize將結果返回到主線程。NativeXml和線程

在excute方法中創建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; 
+3

當您運行此操作時會發生什麼?例外?沒有?空串?調試器崩潰?請提供更多信息。 – Martijn 2011-04-12 12:27:31

回答

8

沒有得到結果返回給主線程或在該行獲得訪問衝突?

ADoc:= ADoc.Create(formMain); 

這一行代碼包含一個錯誤,一個code smell:代碼味道,你reffering到formMain,從一個線程。錯誤在於你不會在類名上調用.Create(),而是在變量名本身上調用.Create()!您可能想要:

ADoc := TNativeXml.Create(nil); 
+0

我同意!我懷疑是線程在第一行終止(可能有一個隱藏的異常)。 Execute過程的第一行,第三行和倒數第二行的斷點將快速確定是否引發了隱藏的異常。無論哪種方式......我絕對同意,對.Create的呼叫是不正確的! – LaKraven 2011-04-12 12:39:39

+0

Ops,對不起。是的,這是錯誤的。將再次改變並測試它。 – marcostT 2011-04-12 19:21:51

+0

@marcostT如果它有效,你應該把Cosmin的答案標記爲正確:) – LaKraven 2011-04-13 10:03:51