我有一个引用DLL的.NET控制台应用程序.如果DLL与EXE位于同一文件夹中,它运行正常,但我想将DLL放在不同的文件夹中.我怎样才能做到这一点?
是否有更快的方法将大位图旋转90或270度而不是简单地使用倒置坐标进行嵌套循环?
位图是8bpp,通常是2048*2400*8bpp
目前我只是简单地使用参数反转进行复制(伪代码:
for x = 0 to 2048-1
for y = 0 to 2048-1
dest[x][y]=src[y][x];
Run Code Online (Sandbox Code Playgroud)
(实际上我是用指针做的,速度要快一点,但大小差不多)
对于大图像,GDI非常慢,纹理(GF7卡)的GPU加载/存储时间与当前CPU时间的大小相同.
任何提示,指针?就地算法甚至会更好,但速度比就地更重要.
Target是Delphi,但它更像是一个算法问题.SSE(2)矢量化没问题,对我来说,在汇编程序中编码它是一个很大的问题
跟进尼尔斯的回答
旧例程的时间:32ms(步骤1)
步长8:12ms的时间
步长16:10ms的时间
步长32+:9ms的时间
与此同时,我还在Athlon 64 X2(5200+ iirc)上进行了测试,其速度略高于四倍(80到19毫秒).
加速非常值得,谢谢.也许在夏季我会用SSE(2)版本折磨自己.但是我已经考虑过如何解决这个问题了,我想我会用完SSE2寄存器来实现直接实现:
for n:=0 to 7 do
begin
load r0, <source+n*rowsize>
shift byte from r0 into r1
shift byte from r0 into r2
..
shift byte from r0 into r8
end;
store r1, <target>
store r2, <target+1*<rowsize> …Run Code Online (Sandbox Code Playgroud) 夏天的商业化平静已经开始,所以我选择了迁移到D2009.我粗略地确定了程序的每个子系统,如果它们应该保持ascii,或者可以是unicode,并开始移植.
它非常好,所有组件都在D2009版本中(有些像VSTView,虽然稍微不兼容)但我现在遇到了一个问题,在某些方面必须保持ansistring,我广泛使用TStringList,主要是作为基本地图.
是否已经有一些容易替换的东西,或者我应该简单地包含一个基于旧的Delphi或FPC源的减少的ansistring tstringlist?
我无法想象我是第一个碰到这个?
这些更改必须相对本地化,以便在我通过验证轨迹时代码仍可与BDS2006编译.这里有一些ifdef没有问题.当然string-> ansistring和char - > ansichar等在我的源代码中不算作修改,因为无论如何我必须这样做,而且完全向后兼容.
编辑:我已经能够解决读者/作家类中的一些问题.这使得Mason的解决方案比我原先想象的更容易.我会认为Gabr的建议是一个后备.
泛型是我买D2009的原因.可惜他们让FPC不兼容
我正在试图找出一种方法来检查字符串的第一个元素,如果它是一个数字或不是.
if not(myString[0] in [0..9]) then //Do something
Run Code Online (Sandbox Code Playgroud)
问题是我收到错误"元素0无法访问 - 使用'长度'或'SetLength"
另一种方式来自我的C-like exprieince - 将字符串的第一个元素转换为char并检查char,但编译错误没有区别.
if not(char(myString[0]) in [0..9]) then //Do something
Run Code Online (Sandbox Code Playgroud)
我该如何完成它?
题:
有一种简单的方法可以获得正在运行的应用程序中泄漏的资源类型列表吗?IOW通过连接到应用程序?
我知道memproof可以做到这一点,但它减速太多,应用程序甚至不会持续一分钟.大多数任务管理员喜欢可以显示数字,但不能显示类型.
检查本身是灾难性的(停止应用程序进程)不是问题,因为我可以检查taskmgr我是否接近(或者至少我希望)
关于资源泄漏狩猎(所以不是记忆)的任何其他见解也受到欢迎.
背景:
我有一个Delphi 7/2006/2009应用程序(编译所有三个),大约几周后它开始表现得很有趣.但是,仅在其运行的一个地方,在其他几个系统上运行直到电源耗尽.
我试图输入一些调试代码来缩小问题范围.并发现EOutofResources的例外是保存文件.(文件保存每天可以发生数千次).
我试图推断出内存泄漏(使用fastmm),但由于数据流非常高(从千兆工业相机的60MByte/s),我只能排除"蠕动"内存泄漏与fastmm,而不是快速闪存的内存泄漏记忆在它发生的时间.如果出现问题,应用程序会在半分钟内填满内存.
主要嫌疑人是文件句柄,以某种方式留下了一些错误和TMetafiles(流式传输到这些文件).小嫌犯是VST,popupmenu和tframes
更新:
另一个可能的提示:它与D7一起运行了两年,现在问题出在Turbo Explorer(我用于稳定的项目未转换为D2009).
Paul-Jan:由于它每周只发生一次(并且可能在晚上发生),因此信息获取速度很慢.这就是为什么我问这个问题,需要在我周四的时候把东西组合起来.简而言之:不,我不知道100%肯定.我打算带上整个Systemtools集合,看看我是否能找到一些东西(因为它会运行几天).我也有机会看到打开的文件.(也许应该尝试找一些mingw lsof并安排它)
但该应用程序看到很少的GUI动作(它是一个机器视觉检测应用程序),除了屏幕刷新+/- 15/s,这是tbitmap stretchdraw + tmetafile,但我得到这个错误保存到磁盘(TFileStream)句柄可能真的累.然而,在同一个流中,TMetafile也可以保存,后来的应用程序不再拥有它,它们可以运行数月.
-------------------更新
我搜索,搜索和搜索,并设法在体外重现问题两三次.当memusage为+/- 256MB(系统有2GB),用户对象200,gdi对象500,而不是一个比预期更开放的文件时,会出现问题.
这不是特别的.我注意到我泄漏了少量的手柄,可能是由于重新渲染帧(VCL中的某些东西似乎泄漏了HPalette的),但我怀疑核心原因是另一个问题.我重用了TMetafile,然后将它清除.我认为清除元文件并不是真的(总是?)调整资源大小,最终整个tmetafile池中的每个元文件都是最大的,并且有20-40 + tmetafiles(每个可以是几个100k),这将会打到桌面堆限制.
这是理论,但我会尝试通过将客户端的桌面限制设置为10MB来验证这一点,但是如果这有任何改变,我将在几周前确认.这个理论也证实了为什么这台机器是特殊的(这台机器平均可能有一个稍微大一点的元文件).偶尔在池中释放和重新创建tmeta文件也可能有所帮助.
幸运的是,所有这些问题(tmetafile和reparenting)都已在新一代应用程序中设计出来.
由于特殊情况(以及我的测试窗口非常有限),这将是一段时间,但我现在决定接受桌面堆作为一个例子(虽然GDILeaks的东西也有些用处).
另一件事是审计揭示了线程中的GDI类型用法(尽管只保存tmetafiles(未使用或以其他方式连接)到流.
-------------更新2.
增加桌面限制似乎只会略微增加问题发生的时间.
不幸的是,我将无法进一步跟进,因为机器已更新为没有问题的框架的更新版本.
总之,我只能说明从旧框架到新框架的三个核心修改:
当然它也可能是其他东西,在重写上述部分时发生了变化,修复了一些非常讨厌的细节错误.它必须是一个非常糟糕的,因为我尽可能多地分析了上述系统.
在一些私人邮件讨论之后更新了nov 2012:回想起来,下一步将是为元文件对象添加一个计数器,并且每次x*1000使用左右只是重新实例化它们,并查看是否有任何改变.如果您遇到类似问题,请尝试查看是否可以在某种程度上定期销毁和重新初始化动态分配的长生存资源.
有人知道如何将文件(文本)描述符与TStream组件关联,以便像I/O这样的writeln()可以重定向到流吗?(如FPC单元StreamIO).在某处是否有预定义的功能(我正在使用XE,但如果它在2009年工作也会很好)
我有很多业务代码依赖于writeln(f,)格式化选项,我想更新以通过网络登录.此升级必须以相对安全的方式完成,因为文件必须与字节保持相同.
(使用其他方法重写此业务代码实际上不是一个选项,如果它不存在我将不得不尝试自己,或者将与写入临时文件并将其读回)
补充:欢迎自定义textrecs的任何示例和/或其中哪个字段具有用户状态的安全空间.
请问,有人知道如何用汇编语言编写字符串输入代码吗?我int 21用来显示和输入字符.
在给定.Net程序集的文件夹的情况下,如何快速查找哪些文件取决于某些给定的程序集?
(用Reflector一个接一个地打开它们并不是我的想法)
我有一个使用cport访问多个串口的程序.
为了配置,到目前为止我只是在组合框中列出所有可用的组件进行选择,但是越来越多的具有(虚拟)串行接口的驱动程序使得为最终用户配置很麻烦.
当前检测与createfile()一起使用,但是这个问题是你只能获得exists/nonexists并且可能"忙"作为信息.
但是为了改进,我需要每个COM端口一个标识字符串,就像它连接的硬件设备/驱动程序(设备管理器)一样.这将使用户更容易缩小范围(因为我们提供有限数量的串行卡)
可能它可以从WMI获得,但这是一个相当丛林,是否有更具体的信息,或更好的代码?
(Delphi XE3,Win7 +,没有需要额外安装或部署的解决方案)
在C/C++中,我们可以声明/定义一个类型的函数指针,然后声明/定义这个类型的一些变量。但我认为这是模棱两可的。
例如:
typedef void ( *pFunc )();
// typedef void ( aFunc )();
void theFunc() {
cout << "theFunc has been called successfully." << endl;
};
int main() {
pFunc pf0 = theFunc;
pFunc pf1 = &theFunc;
pf0();
( *pf0 )();
pf1();
( *pf1 )();
};
Run Code Online (Sandbox Code Playgroud)
理论上,只有pFunc pf1 = &theFunc;和(*pf1)();是合法的,但以上都可以通过编译。
在Pascal语法中,我们需要分别定义函数的vars或函数指针的vars,它们的含义是不同的,而且更加清晰(至少我是这么认为的)!
此外,我们不能声明/定义函数的变量而不是函数指针的变量!我尝试了以下并失败了。
typedef void ( aFunc )();
aFunc af0 = theFunc;
Run Code Online (Sandbox Code Playgroud)
如果使用其他类型,例如 int/double,则有非常严格的语法限制我们正确使用它们。(如果int*与 不同int,为什么*pf0与 相同pf0?!) …