2011-02-23 64 views
3

嘿傢伙!我有一個線程。當線程執行時,一個無限循環開始,讀取類的成員變量。奇怪的代碼執行:執行在while循環的中間開始!

奇怪的是,一切都很好,特定的點,while循環開始在中間執行。

代碼:

procedure MyThread.Execute; 
var 
    i: Integer; 
begin 
    NameThreadForDebugging('MyThread'); 

    while True do 
    begin 
    if (PrevLine1 <> CurLine1) and (PrevLine2 <> CurLine2) then 
    begin 

     {some code} 

     PrevLine1 := CurLine1; //<-- The place where execution starts... 
     PrevLine2 := CurLine2; 

     {some code} 
    end; 
    Sleep(500); 
    end; 

    self.Terminate; 
    self.Destroy; 
end; 

我可以到處設置斷點在此過程中,但它停止在

PrevLine1 := CurLine1; //<-- The place where execution starts... 

CurLine1是它可以通過對象的屬性來改變私有成員。它一切正常,但只有一次發生錯誤的行爲。

有沒有人遇到類似的事情或知道要採取哪些步驟來解決這個問題?

在此先感謝!

+2

您是否有兩個版本的文件,一個是由IDE找到的(先查找搜索路徑),另一個是由編譯器找到的(先查看項目的源路徑)。這在Delphi 2007中經常發生,當你同時有幾個樹結帳時。另一個可能的幫助是構建所有。 – 2011-02-23 10:26:26

+0

你可能會發現有趣的問題[德爾福有任何相當於C的揮發性變量?](http://stackoverflow.com/questions/232075/does-delphi-have-any-equivalent-to-cs-volatile-variable) – 2011-02-23 10:36:43

+0

@Nick我不確定C'volatile'與線程有什麼關係? – 2011-02-23 12:19:41

回答

1

好吧,我現在工作了! 發佈他的答案的一位成員建議我從Execute方法中刪除所有代碼,並開始將其重新放回小塊。不幸的是,他刪除了他的答案,我不記得他的名字。

問題是,我在我的執行代碼中使用了CPortLib組件(TComPort)。然後,我在while循環中打開並關閉了連接,並跳過代碼(與if/else或smth無關)。

奇怪的是,它跳過這樣的代碼! 謝謝大家誰試圖幫助。我很感激!

3

我的猜測:您正在使用Optimization=True進行調試。關閉優化,重建,再試一次。

這很可能是因爲Delphi 2010中默認的「Debug」配置文件具有Optimization = True。

+1

我嘗試了{$ O-},但沒有改變。謝謝! – Peacelyk 2011-02-23 11:19:23

2

如果程序中有任何未使用的語句,那麼Delphi編譯器會自動消除這些語句。它實際上是一個很好的編譯器功能

+0

是的,但它的工作原理。有時候它不會或者像我描述的那樣行事,之後一切都很正常。 – Peacelyk 2011-02-23 11:21:44

+0

你能告訴它什麼時候不能正常工作嗎? – Bharat 2011-02-23 11:52:27

1

檢查你是否正在編譯正確的單元,嘗試添加一些垃圾在那裏,你仍然可以編譯?可用的斷點位於正確的位置嗎?

你在{some code}部分有什麼代碼?這是否是一個一直導致錯誤的陳述?

1

你在哪裏初始化PrevLine1,PrevLine2,CurLine1和CurLine2?如果在調用Execute之前它們最初設置爲不同的值,那麼編譯器可能會優化第一個條件測試,因爲它可以告訴它它始終爲真。

PrevLine1 := 1; 
PrevLine2 := 1; 
CurLine1 := 2; 
CurLine2 := 2; 

// The next line never has to execute on the first pass 
// through the loop, as the test will always be true at 
// this point. 
if (PrevLine1 <> CurLine1) and (PrevLine2) <> (CurLine2) then 
begin 
    .. 
end; 

關閉優化,如其他人所說,或看在開始後NameThreadForDebugging第一行中的CPU窗口生成的彙編代碼。然後查看是否觸發了第一個循環測試中的斷點。

1

嘗試把這種人爲的調試中斷指令在方法的第一行:

asm 
int 3 
end; 

然後運行,看它打破,打開CPU視圖,查看是否有針對NameThreadForDebugging調用生成任何代碼。

- jeroen

1

我有一個單位的問題。原因是文件中有特殊的不可打印字符(例如Formfeed)。做了一個ctrl + C然後ctrl + v在一個新的單位,並保存它在以前的地方,一切都很好。