奇怪的代码执行:执行在while循环中间开始!

时间:2011-02-23 10:12:39

标签: delphi

嘿伙计们!我有一个帖子。执行线程时,会启动无限循环,这会读取类的成员变量。

奇怪的是,一切都很好到某一点,而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是私有成员,可以通过object属性进行更改。 一切正常,但只有一次出现错误行为。

有没有人遇到类似的事情或知道采取什么措施来解决这个问题?

提前致谢!

7 个答案:

答案 0 :(得分:3)

我的猜测:您正在使用Optimization=True进行调试。关闭优化,重建,再试一次。

这很可能是因为Delphi 2010中的默认“Debug”配置文件具有Optimization = True。

答案 1 :(得分:2)

如果程序中有任何未使用的语句,则Delphi编译器将自动删除这些语句。它实际上是一个很好的编译器功能

答案 2 :(得分:1)

检查你是否正在编译正确的单位,尝试在那里添加一些垃圾,你还能编译吗?可用的断点位于正确的位置吗?

您在{some code}部分有什么代码?这是一个if语句总是会导致错误吗?

答案 3 :(得分: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窗口中生成的汇编代码。然后查看是否触发了第一个循环测试的断点。

答案 4 :(得分:1)

尝试将此人工调试中断指令放在方法的第一行:

asm
 int 3
end;

然后运行,观察它,打开CPU视图,看看是否为NameThreadForDebugging调用生成了任何代码。

- 的Jeroen

答案 5 :(得分:1)

我有一个单位的问题。原因是文件中存在特殊的不可打印字符(例如Formfeed)。做一个ctrl + C然后ctrl + v在一个新的单位并保存它代替前一个,一切都很顺利。

答案 6 :(得分:1)

好的,我现在就开始工作了! 发表他的回答的一位成员建议我从Execute方法中删除所有代码并开始用小块回来。不幸的是,他删除了他的答案,我不记得他的名字了。

问题是,我在执行代码中使用了CPortLib组件(TComPort)。然后我在while循环中打开并关闭了连接,在某些时候它跳过了代码(与if / else或smth无关)。

奇怪的是,它跳过这样的代码! 谢谢所有试图帮助的人。我很感激!