小编Eri*_*nge的帖子

StrToFloat无法在Delphi 64位中报告无效的浮点数

以下代码尝试将值转换为远超出双精度范围

StrToFloat('1e99999999')
Run Code Online (Sandbox Code Playgroud)

使用Windows 32位编译器在Delphi 10.2r3中正确报告错误的浮点值,但是当使用Window 64位编译器编译时,它会静默返回0(零).

当浮点值不正确时,有没有办法让StrToFloat报告错误?

我已经尝试过TArithmeticException.exOverflow,但在这种情况下这没有效果.

我也尝试过TArithmeticException.exPrecision,但它在许多通常的近似情况下触发(在转换'1e9'时触发它).

Delphi 10.2 update 3注意到了这个问题

附录:要解决这个问题,我已经启动了一个洁净室替代实现字符串到双重转换,初始版本带有测试可以在dwscript commit 2ba1d4a中找到

delphi 64-bit delphi-10.2-tokyo

22
推荐指数
1
解决办法
949
查看次数

在Windows 7中成功执行SuspendThread后,GetThreadContext失败

我在Windows 7中的采样分析器上遇到了一个奇怪的问题(以前的Windows操作系统上没有AFAICT问题,无论是32位还是64位).

在调用重新启动进程之前SuspendThread,探查器通过定期挂起线程,然后查看上下文来工作.所有这些都是从多媒体计时器的线程环境完成的(准确度大约为1kHZ,在Windows 7之前的操作系统通常会导致可忽略的性能损失).GetThreadContextResumeThread

在Windows 7和Windows 7下,即使对SuspendThread(和ResumeThread)的调用都成功,调用也会GetThreadContext失败并显示错误:

ERROR_NOACCESS
998(0x3E6)
对内存位置的无效访问.

有很高的可能性,虽然不是所有的时间.

我的意思是,对于一些分析运行,一切都会像在其他操作系统上一样工作(所有的GetThreadContext调用都会成功),但对于其他运行,它们几乎都会失败(除了数十万之外,可能会丢失十几个).它使用完全相同的二进制文件,相同的参数.

我已经尝试过关于重复GetThreadContext调用的模糊相似问题的建议,但没有更多的成功.我也试过SleepSuspendThread和之间做一个GetThreadContext,然后GetThreadContext更频繁地成功,虽然它会导致剧烈的减速.

然而,它表明Windows 7操作系统正在返回,SuspendThread而线程可能尚未暂停 - 但是,如果是这种情况,我不知道如何或是否正确等待暂停,在线程中循环并且敲击GetThreadContext没有'做到了.

编辑: 16字节对齐CONTEXT结构的地址GetThreadContext为丹巴特利特建议似乎正在做的伎俩!

debugging winapi windows-7

19
推荐指数
1
解决办法
2077
查看次数

JavaScript/HTML5的机器可读(WebIDL)参考?

我正在寻找JavaScript类(成员,方法,参数......)的机器可读参考,特别是与HTML5标准(画布,存储等)相关.

到目前为止,我所发现的只是W3C网站上的规范,其中包括规范的一部分,http: //dev.w3.org/html5/2dcontext/ 其中包含CanvasRenderingContext2D的Web IDL,其他页面包含其他部分.

但我必须是盲目的,因为我找不到一些全局索引/摘要,所有有效的IDL按版本/草稿/等分类和分类.

谁知道它在哪里可以找到?

javascript html5 idl

15
推荐指数
1
解决办法
1264
查看次数

将64位整数加载到双精度SSE2寄存器的最佳方法是什么?

xmm在32位模式下,在SSE2寄存器中加载64位整数值的最佳/最快方法是什么?

在64位模式下,cvtsi2sd可以使用,但在32位模式下,它仅支持32位整数.

到目前为止,我还没有发现更多:

  • 使用fild,fstp以堆叠然后movsdxmm寄存器
  • 加载高32位部分,乘以2 ^ 32,加上低32位

第一个解决方案很慢,第二个解决方案可能会引入精度损失(编辑:无论如何它都很慢,因为低32位必须转换为无符号...)

有更好的方法吗?

double assembly sse int64 sse2

14
推荐指数
1
解决办法
2496
查看次数

从接口获取子接口

这是接口的一个特例,其中一个类实现了同一接口的多个版本,即.类似以下内容

IBase = interface
   procedure Foo;
end;

ISub = interface (IBase)
   procedure Bar;
end;

ISpecialBase = interface (IBase) end;

ISpecialSub = interface (ISub) end;

TMyClass = class(TInterfacedObject, ISpecialBase, ISpecialSub)

   procedure SpecialFoo1;
   procedure SpecialFoo2;
   procedure SpecialBar;

   procedure ISpecialBase.Foo = SpecialFoo1;

   procedure ISpecialSub.Foo = SpecialFoo2;
   procedure ISpecialSub.Bar = SpecialBar;

   function GetTheRightOne(parameters) : IBase;

end;

...

function TMyClass.GetTheRightOne(parameters) : IBase;
begin
   if (something complex depending on parameters) then
      Result := ISpecialBase(Self)
   else Result := ISpecialSub(Self)
end;
Run Code Online (Sandbox Code Playgroud)

当然,在实际案例中大约有十几个ISpecialXxxx.

非常重要的是只需要一个实例,即.我想避免创建适配器或虚拟实例只是为了推迟ISpecialXxxx实现,因为之前设计的唯一目的正是让单个实例处理许多出色的接口(即TMyClass的RefCount可以达到千分之一秒) ).

现在的问题是GetTheRightOne()返回一个IBase,但在某些时候我想检查是否可以将IBase强制转换为ISub.

有没有办法用上面的申报表格来做?

一种方法是添加一个

function …
Run Code Online (Sandbox Code Playgroud)

delphi interface

13
推荐指数
3
解决办法
768
查看次数

如何避免GetFileAttributes中的网络停顿?

我正在测试远程共享(在Windows服务器上)中是否存在文件.用于测试的基础函数是WinAPI的GetFileAttributes,发生的情况是该函数在各种情况下可能需要过多的时间(几十秒),例如当目标服务器处于脱机状态,存在权限或DNS问题时等.

但是,在我的特定情况下,它始终是LAN访问,因此如果文件在不到1秒的时间内无法访问,那么通常无法通过等待几十秒来访问...

是否有替代GetFileAttributes不会失速?(除了在一个线程中调用它并在超时后杀死线程,这似乎带来了自己的问题)

windows networking

12
推荐指数
1
解决办法
7673
查看次数

在Delphi中记录方法和const参数

当涉及"涉及方法的记录"时,看起来Delphi编译器不支持const记录参数.

以前没试过滥用const约定,我有点惊讶地发现编译器接受了这样的代码:

type
    TTest = record
       Field : String;
       procedure Update;
    end;

procedure TTest.Update;
begin
    Field := Field + '+1';
end;

procedure DoStuff(const t : TTest);
begin
    ShowMessage(t.Field);
    t.Update;
    ShowMessage(t.Field);
end;
Run Code Online (Sandbox Code Playgroud)

虽然如果你尝试t.Field:='doh';DoStuff中执行操作 ,编译器会正确地抱怨,但是你可以调用修改"const"记录的方法,甚至没有提示或警告.因此,这与引用类型(例如类或动态数组)不同,其中允许直接字段写入(因为const仅限制对参数本身的更改).

附录:这允许以这种方式修改声明的编译时常量,如:

const
   cTest : TTest = (Field : '1');
...
cTest.Update;              // will show '1' then '1'+'1'
ShowMessage(cTest.Field);  // will show '1' (because optimized at compile-time)
Run Code Online (Sandbox Code Playgroud)

这是接受/记录的行为吗?还是仅仅是编译器的缺点?

delphi methods record

12
推荐指数
1
解决办法
6363
查看次数

Delphi的线程安全优先级队列?

我正在寻找一个在Delphi中实现的优先级队列,它在多线程环境中运行良好.

理想情况下无锁,或设计用于多线程插入/删除,其中包含比单线程实现(我已经拥有)的锁定包装更好的东西.

特殊性在于,在正常操作中,当顶部(最高优先级项)改变时,将仅存在添加,删除和通知,而最高优先级项的"弹出"操作应该非常罕见.

它将用于监视/超时线程监视任务,在其他线程中执行,这些任务预计在大多数时间内正常终止,因此它们只是从队列中添加/删除.超时线程基本上会等待下一个超时事件,因此在最高优先级事件发生更改时需要通知.

任务由脚本处理,可以随时安全地终止.

如果有比这更好的算法而不是优先级队列,它们也可能是很好的答案!

编辑:在Martin James的评论之后,另一个特点是相对较少的不同超时值,并且对于每个超时值,问题变成FIFO队列的问题.

delphi priority-queue thread-safety

12
推荐指数
1
解决办法
2681
查看次数

仅为某些类启用Delphi XE RTTI

我正在尝试仅为我的类的子集启用RTTI.

原因是对于那些我想要RTTI的类,我也想在公共方法上使用RTTI,但如果在项目范围内启用它,那么所有类的所有公共方法都会进入最终的可执行文件.这基本上关闭了智能链接,因为编译器认为每个公共方法都可以在运行时调用,因此最终编译几乎所有东西,厨房沉入可执行文件......

我尝试了几件事:

  • 在项目级别关闭RTTI,{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}然后为相关单元重新启用它会导致在$ RTTI指令的编译时(编译器中某处的AV)崩溃.
  • 在项目级别关闭RTTI然后启用逐类编译,但在运行时,在尝试访问暴露类的RTII时,会在"Rtti.pas"中导致不合格的AV深度
  • 通过嵌入在".inc"中的$ RTTI指令控制RTTI所有单元在编译时使用随机AV结果(总是在$ RTTI指令的行,但不总是在同一单元中).

还有其他想法吗?

delphi rtti

9
推荐指数
1
解决办法
1147
查看次数

如何在运行时检测某些编译器选项(如断言)是否设置为ON?

检查断言是否在Delphi中处于活动状态的条件是什么?

当代码中的断言不活动时,我希望能够做一些事情来抑制有关未使用变量的提示

procedure Whatever;
var
   v : Integer;
begin
   v := DoSomething;
   Assert(v >= 0);
end;
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,当断言未激活时,会有一个关于变量v被赋予从未使用的值的提示.

代码在一个将在各种环境中使用的库中,因此我能够专门测试断言,而不是像DEBUG那样的自定义条件.

delphi assert runtime conditional-compilation

7
推荐指数
1
解决办法
681
查看次数