Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String Delphi字符串不可靠_String_Delphi_Pascal - Fatal编程技术网

String Delphi字符串不可靠

String Delphi字符串不可靠,string,delphi,pascal,String,Delphi,Pascal,你好,我目前正在创建一个相当繁重的应用程序,它依赖于另一个应用程序线程,并且还抓住了句柄。因此,如果该应用程序将冻结,那么我的应用程序也会冻结,并且在目标软件执行重载时,它确实会时不时地延迟一点。) 问题是,如果更严重的应用程序“滞后”,我会遇到字符串的意外问题,它们会给我不可靠的输出 有人知道为什么会发生这种情况,以及我如何解决或解决这个问题吗 我目前使用的解决方案是belove,但这并不是我真正想要做的,因为它确实使运行时非常不可靠,因为我无法确定结果 function GetInt(MyN

你好,我目前正在创建一个相当繁重的应用程序,它依赖于另一个应用程序线程,并且还抓住了句柄。因此,如果该应用程序将冻结,那么我的应用程序也会冻结,并且在目标软件执行重载时,它确实会时不时地延迟一点。)

问题是,如果更严重的应用程序“滞后”,我会遇到字符串的意外问题,它们会给我不可靠的输出

有人知道为什么会发生这种情况,以及我如何解决或解决这个问题吗

我目前使用的解决方案是belove,但这并不是我真正想要做的,因为它确实使运行时非常不可靠,因为我无法确定结果

function GetInt(MyNum:string):integer;
begin
  try
    result := strtoint(MyNum);
  except
    result := 0;
  end;
end;

例如,我编写了这个脚本,突然发现$ReBEFF不是一个有效的整数。(突然间,它已经运行了好几个小时)

oldB是一个字节,它作为一个转换为十六进制的数字进行处理。oldB设置为始终为0。它不应更改,尤其是不应更改为Re,因为Re不在十六进制数字系统内

xx0000 = B
00xx00 = G
0000xx = R
示例脚本(这不是唯一一个出现字符串问题的代码部分,它在整个应用程序中随机出现)


您描述的症状是由于代码中的缺陷而导致的内存损坏。您正在调用的库函数没有可能产生这些症状的已知缺陷。概率接近1时,代码中存在缺陷

具有这些症状的一个常见缺陷是在内存被释放后写入内存。如果内存管理器将释放的内存重新用于新的分配,则会出现这种症状

您将需要进行更多的事实调查调试,以确定缺陷的来源。处于完全调试模式的FastMM将是一个开始研究的好工具。但你可能需要的不仅仅是工具

让我说清楚,以防你没有领会我的意思。所有证据都指向代码中的缺陷

现在,我们可以看到一些关于代码的具体注释:

我担心的是,您似乎已将所有异常处理放在代码的多个位置。一般来说,您不应该处理异常。您应该让异常向上传播调用堆栈。首先删除所有这些异常处理程序

对Windows API的调用
GetModuleFileName
忽略返回值。Windows API函数不会引发异常,通常通过返回值指示成功或失败。请查阅您调用的所有Windows API函数的文档

您对全局变量的使用相当令人担忧。我们可以看到的那些全局变量应该是
TMainF
的字段。也许你还有其他全球性的问题

您应该为控件指定有意义的名称
Label32
对代码的读者没有任何意义,通常是你。不要让IDE编写代码

从颜色通道值到RGB值的转换应通过逐位操作完成。根本没有地方可以进行文本转换

Color := B shl 16 or G shl 8 or R;

Delphi应用程序本身并不不可靠,它们的字符串操作也不可靠。这些症状听起来像是自我造成的内存损坏/覆盖的典型案例。两个问题:你的应用程序是否在VCL线程中完成所有工作?你试过在RTL内存管理器中打开“完全调试模式”吗?他们自己的代码片段不能产生你所描述的问题。我将关注您在第一段中所说的内容,并确保两个应用程序之间的交互是健壮的。顺便说一句,通过十六进制字符串将
R
G
B
转换为整数的效率非常低。替换为一个衬里:
结果:=B shl 16或G shl 8或R
。我猜这个十六进制/字符串技巧来自JavaScript或php背景……我确实同意有更好的方法可以做到这一点,但是这并不能改变这样一个事实,即代码输出的东西不应该太旧B:byte:=0;1byte=255=0xFF inttohex(oldB)在目标应用程序“冻结”一刻后,再也不会“重新”问题,直到所有程序正常运行数小时。正如您提到的,“释放后写入内存”听起来非常合理,因为它是一个返回错误值的局部变量,不管oldB的值是多少,它总是返回一个十六进制值,最多为255。听起来您不想承认程序中可能存在缺陷。本地还是全球?它们都可能被破坏。字符串存储在堆上,因此无论指向它的变量是否为本地变量,堆损坏仍然是可能的。我并不是说您的RGB转换实现有问题。我只是指出它是次优的。你的缺点就在别处。我不否认这是当然不可能的。当出现错误时,人们总是修复应用程序中的问题,学习新东西总是很好的;)然而,当目标软件冻结时,错误呈现的方式让人感觉有些函数重叠了,这样字符串就变差了。由于局部变量位于堆栈中(我想?),当线程冻结另一个线程时,是否会将另一个值推送到堆栈中,从而返回错误的值?我不确定这是否可能。如果你有任何其他建议,我很高兴听到。那是胡说八道。这是你编的。滞后?!!你一点都不明白。你不会听那些人的。祝你好运
function GetAppPath:string;
var
  Buffer: Array[0..260] of Char;
  Path:string;
begin
  try
    GetModuleFileName(hInstance, Buffer, Length(Buffer));
    Path := ExtractFilePath(Buffer);
    result := Path;
  except
  end;
end;

Should have returned D:\Download\Finished\Apps\
returned D:\Download\Finished\A#ps\
Color := B shl 16 or G shl 8 or R;