我正在编写一个诊断程序(比如珠穆朗玛峰,但更简单),我需要知道HardDrive的速度有多快.我想知道的事情如下:
1 - 每秒字节数(读取)
2 - 每秒字节数(写入)
3 - SMART数据
我想我可以使用WMI来查询这样的事情,但我不知道如何.如果我需要购买组件或获得开源组件并不重要.我也知道Windows Perfmoon能够做到这一点,但我无法使用它.
我知道当我strings在Delphi APP和Delphi DLL之间共享时,我需要Sharemem在app和dll项目源中添加use子句中的第一个单元.
但是,如果dll导出的函数只接受Pchars但在我使用的一些dll方法中,我strings应该使用sharemem吗?让我展示一个示例代码:
procedure ShowMyCustomMessage(aMessage : Pchar);
var
vUselessString : string;
begin
vUselessString := aMessage;
ShowMessage(vUselessString);
end;
exports
ShowMyCustomMessage;
Run Code Online (Sandbox Code Playgroud)
在那个简单无用的情况下,dll接受一个Pchar但在导出的方法内部,dll创建一个stringvar.我ShareMem也应该添加吗?
怎么样WideString?传递WideString参数是否需要使用Sharemem?
我们有一个使用Delphi 2010和Indy 10开发的应用服务器.该服务器每秒接收超过50个请求并且运行良好.但在某些情况下,在我看来,Indy非常模糊.它们的组件很好,但有时我发现自己只是为了理解一个简单的事情而深入研究源代码.Indy缺乏良好的文档和良好的支持.
我遇到的最后一件事对我来说是一个大问题:我必须检测客户端何时正常断开连接(例如,当客户端崩溃或关闭时.不告诉服务器它将断开连接)并且indy无法去做.如果我想要,我将不得不开发心跳,汇集或TCP保持活动等算法.我不想花更多的时间来做一个,至少我认为,组件工作.经过一些研究,我发现这不是Indy的错,但这是所有阻塞套接字组件的问题.
现在我真的想把服务器的核心改成另一个好的套件.我必须承认我倾向于使用非阻塞套接字.基于此,我有一些问题:
我知道这一定是一个主观问题,但我真的很想听到你的意见.我的第一个问题是我最关心的问题.我不在乎我是否需要支付100,500,1000,10000美元,但我想要一个完整的解决方案.现在,我正在考虑Ip*的工作原理.
编辑
我觉得有些人不明白我想要什么.我不想创建自己的套接字.我已经使用插座很长一段时间了,我厌倦了它.真.
非阻塞套接字可以检测客户端断开连接.这是事实,它在整个互联网上都有很好的文档.非阻塞套接字始终检查套接字状态是否有新的传入数据,并且可以检测到套接字无效.这不是心跳算法.在客户端使用心跳算法,它会定期向服务器发送数据包(也称为保持活动状态)以告知它仍处于活动状态.
编辑
我不是说清楚.也许是因为英语不是我的主要语言.我并不是说可以在不尝试从套接字发送或接收数据的情况下检测掉线连接.我所说的是每个非阻塞套接字都可以这样做,因为它们不断尝试从套接字读取新的传入数据.为什么这么难理解?如果你们下载并运行ip*工程演示,特别是echoserver和echoclient(都使用TCP),你可以自己测试.我已经测试了它,它的工作方式与我预期的相同.即使您在非阻塞模式下使用旧的TCPSocketServer和TCPSocketClient,您也会看到我的意思.
为什么我不能在Dunit Test projet中设置版本信息?该项目的复选框已禁用,但其他项目未禁用.看截图:

假设您有一个设计精良的Delphi项目,该项目尊重依赖注入和其他一些良好实践.
现在让我们假设你需要模拟一个定义为的类:
TMyClass = class
public
procedure Method1;
procedure Method2
end;
Run Code Online (Sandbox Code Playgroud)
Method1而且Method2不是虚拟的.在这种情况下你做什么?要模拟一个对象,我们需要继承它和override你想要模拟的每个方法,但在这种情况下它是不可能的,因为它们不是virtual.我应该更改源代码以添加virtual我需要模拟的每个方法吗?不是很糟糕吗?
编辑
我正在考虑创建一个编译器指令来使类中的所有字段virtual成为一个好的意识形态?只有我的测试套件才会设置编译器指令.
EDIT2*
Embarcadero应该提供一种简单的方法,可以将类的方法指针更改为另一个方法点,而无需使用virtual.
场景:
Delphi 2010从svn trunk运行最新的Indy版本.
我有一个使用idHTTP发送http请求的应用程序.只要应用程序正在运行,此idHTTP只创建一次并保存在内存中.我向同一个http服务器(也是我开发的应用程序)发送了大量的Web请求.
我使用keep-alive来保持套接字连接.
在几次请求之后,我得到了一个EIdConnClosedGracefully客户端,并且在得到此异常之后没有我做的事情,对同一服务器的每个跟随请求都会产生相同的异常.
我试图断开连接,关闭套接字,清除IOHandler缓冲区,没有任何工作.
如果我销毁IdHttp对象并在异常发生后重新创建它,一切正常.但这不是我想要的,因为我需要一直连接到服务器(以避免TIME_WAITS等).
有没有人知道如何EIdConnClosedGracefully在客户端处理异常并使idHttp在该异常发生后工作?
编辑
我自己开发了Web服务器,我肯定不会在客户端请求后断开连接.我知道这个例外是可以的,但是不可行的是套接字在此之后变得无法使用.Indy应该从此异常中恢复,断开套接字并在需要时重新连接它.正如我所说,这个例外正在向用户展示,而不仅仅是在Delphis IDE上.我真正需要的是获得此异常后的一种方式,我必须能够继续使用此套接字.-
考虑以下代码:
TMyList = class(TList<IMyItem>, IMyList)
Run Code Online (Sandbox Code Playgroud)
Delphi向我显示错误:
[DCC Error] test.pas(104): E2003 Undeclared identifier: 'QueryInterface'
Run Code Online (Sandbox Code Playgroud)
是否有实现的通用列表IInterface?
我需要创建一个表单(使用CreateWindow函数),而无需VCL使用Windows API(或任何可视控件)的任何帮助.
这个表格将有a InputBox,a Button和a BitMap(就像TImage).
我无法在互联网上找到任何样本.有没有人知道我可以下载除MSDN之外的样本的好地方?
我有一个Delphi DLL,我想在我的应用程序内部加载一个线程(不止一个,确切地说).DLL只是创建一个对象,然后它使用它并销毁它.从这个角度来看,DLL代码是线程安全的.
但是如果我在一个线程中加载该DLL会发生什么?DLL仍然是线程安全的吗?关于加载DLL的线程,我应该知道什么?我已经看到VCL具有在创建线程时设置的IsMultThread属性,但是dll会得到关于此的通知,还是应该手动执行?
delphi ×10
delphi-2010 ×2
dll ×2
dunit ×2
sockets ×2
winapi ×2
components ×1
forms ×1
generics ×1
hard-drive ×1
hardware ×1
http ×1
indy ×1
interface ×1
memory ×1
mocking ×1
svn ×1
unit-testing ×1
version ×1
wmi ×1