奇怪的是,一切都很好到某一点,而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属性进行更改。 一切正常,但只有一次出现错误行为。
有没有人遇到类似的事情或知道采取什么措施来解决这个问题?
提前致谢!
答案 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无关)。
奇怪的是,它跳过这样的代码! 谢谢所有试图帮助的人。我很感激!