C++ 使用C动态链接库增加VB代码执行速度

C++ 使用C动态链接库增加VB代码执行速度,c++,dll,vb6,C++,Dll,Vb6,我有一个旧的VB6程序,它利用C DLL进行数值积分,C DLL也是在VS6中编译的。(是的,我知道我应该将代码更新到.NET等,但它只是工作。)最近,我尝试了一些比平常更复杂的计算,并注意到当鼠标以主窗体移动时,程序运行得更快。也就是说,当给定一个要集成的特定大问题时,如果鼠标在单击命令按钮后静止不动,则执行/集成大约需要5秒钟,但如果鼠标在未单击窗体的情况下四处移动,则执行/集成大约需要1秒钟。由于该程序也会优化参数以适应数据,这会在进行拟合的总时间上产生巨大差异 我做了一些工作来缩小效果的

我有一个旧的VB6程序,它利用C DLL进行数值积分,C DLL也是在VS6中编译的。(是的,我知道我应该将代码更新到.NET等,但它只是工作。)最近,我尝试了一些比平常更复杂的计算,并注意到当鼠标以主窗体移动时,程序运行得更快。也就是说,当给定一个要集成的特定大问题时,如果鼠标在单击命令按钮后静止不动,则执行/集成大约需要5秒钟,但如果鼠标在未单击窗体的情况下四处移动,则执行/集成大约需要1秒钟。由于该程序也会优化参数以适应数据,这会在进行拟合的总时间上产生巨大差异

我做了一些工作来缩小效果的来源。鼠标移动确实会将CPU时钟频率从1600 MHz增加到2600 MHz,但这似乎不足以在单个线程上实现如此大的增加。在调试过程中,我发现集成例程在DLL调用之前会毫不延迟地执行初步的VB代码,并且在传递变量后,大部分计算时间都花在DLL函数中。在DLL中调试表明,大部分额外的时间都花在了数值例程的重复循环中,但是没有明显的原因表明鼠标移动会加快这些循环


这是否只是一种加速CPU时钟频率的效果,尽管执行时间大大缩短?还是有其他解释

我想可能是windows在接收输入时对VB应用程序进程进行了偏向?听起来很随意

尝试任务管理器->流程->右键单击应用程序->设置优先级->高

看看这是否会产生类似的结果

如果是这样,您可以通过几种方式设置程序的优先级,其中之一是使用START命令开始使用批处理文件

START   ["title"] [/Dpath] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED] [/LOW | /NORMAL | /HIGH | /REALTIME] [/WAIT] [/B] [command / program] [parameters]

我终于找到了问题所在。事实证明,它与VB代码或处理速度无关,但它完全是DLL C++代码中的一个问题。如果DLL执行需要很长时间,则DLL中的If语句会查找系统消息,特别是允许用户(通过窗体上的按钮)取消执行。在该序列中,使用GetMessage(&msg,NULL,0,0)检查取消消息。GetMessage将等到收到系统消息后才允许继续执行。因此,在主窗体上移动鼠标是一种持续发送消息的简单方法,这将允许DLL以或多或少的全速运行。不移动鼠标,它会挂起几秒钟,等待自动生成的系统消息触发。

解决方案是使用PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)来检查发布的取消消息。PeekMessage将查找一条消息,如果没有找到,将允许立即继续执行主代码。


谢谢大家的建议。

(是的,我知道我应该将代码更新到.NET等,但它确实有效。)
:这句古老的格言是:“如果它没有坏,就不要修复它!”在
控制面板的
电源选项中
尝试使用
高性能
计划,而不是默认的
平衡
。(Windows server版本上也有一个特别讨厌的功能。)使用高性能设置将CPU锁定在100%。对执行时间没有影响。感谢suggestion.PS-我能够使用VS2013中的调试功能非常轻松地跟踪GetMessage问题,特别是使用检测(而不是采样)模式对DLL进行性能和诊断分析。首先在VS2013中重建DLL项目。