鼠标移动使用C DLL增加代码执行速度VB

时间:2014-03-18 02:47:28

标签: c++ dll vb6

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

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

这是否只是加快CPU时钟频率的效果,尽管执行时间大大减少了?或者有另一种解释吗?

1 个答案:

答案 0 :(得分:0)

我终于找到了问题所在。事实证明它与VB代码或处理速度无关,而是完全是DLL的C ++代码中的一个问题。 DLL中的If语句在DLL执行需要很长时间的情况下查找系统消息,特别是允许用户取消执行(通过表单上的按钮)。在该序列中,使用GetMessage(& msg,NULL,0,0)来检查取消消息。 GetMessage将等待,直到收到系统消息,然后才允许继续执行。因此,在主窗体上移动鼠标是一种不断发送消息的简单方法,这将允许DLL以或多或少的全速运行。没有鼠标移动,它会挂起几秒钟,等待一些自动生成的系统消息触发。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms644936(v=vs.85).aspx

解决方案是使用PeekMessage(& msg,NULL,0,0,PM_NOREMOVE)来检查已发布的取消消息。 PeekMessage将查找一条消息,并且找不到,将允许主代码的执行立即继续。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms644943(v=vs.8almost5).aspx

感谢大家的建议。