鼠标移动增加代码执行速度VB与C DLL
Mouse movement increases code execution speed VB with C DLL
我有一个旧的VB6程序,在C DLL的帮助下进行数值积分,也是在VS6中编译的。(是的,我知道我应该更新代码到。net等,但它只是工作。)最近,我尝试了一些比平时更复杂的计算,发现当鼠标在主窗体中移动时,程序运行得更快。也就是说,当给定一个特定的大型问题要集成时,如果在单击命令按钮后鼠标保持不动,则执行/集成大约需要5秒,但如果在不单击表单的情况下移动鼠标,则大约需要1秒。由于程序还对参数进行优化以拟合数据,因此这在进行拟合的总时间上产生了巨大的差异。
我做了一些工作来缩小影响的来源。鼠标移动确实会将CPU时钟频率从1600 MHz增加到2600 MHz,但这似乎不足以在单个线程上提供如此大的增加。在调试中,我发现集成例程执行VB的初始代码直到调用DLL没有延迟,大部分的计算时间是在传递变量后的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以差不多全速的速度运行。在没有鼠标移动的情况下,它会挂起几秒钟,等待自动生成的系统消息触发。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
谢谢大家的建议。
- 如何在 64 位 vb.net Windows 应用程序中引用 32 位 dll
- 如何将 VB.Net 字符串作为字符*传递给C++dll?
- VB.NET DLL中的C++DLL函数复制
- 如何使函数返回数组?用于制作在VB.NET中使用的DLL
- C++ DLL 包装器 vb.net 传递字节数组的字节数组?
- 内存损坏从vb.net调用c dll
- DLL不导出Visual Studio 2013 VB代码中的字符串
- 使用P/Invoke从MFC DLL函数中读取VB.NET中的结构化数据
- C++ dll variable to vb.net exe
- 在vb.net中调用C DLL文件
- 从 VB.NET 调用非托管代码C++ dll
- Pinvoke与GCC在VB.net 2010中编译的c++dll有关
- 写入传递给 C++ DLL 的 VB 字符串时崩溃
- 使用 CoCreateInstance 从C++调用 COMVisible VB.Net dll
- 将字符串从 C++ dll 返回到 vb
- dll从VC++导入到VB函数的转换从dll返回错误,因为缺少链接库
- 将 c++ dll 导入 vb.net 时 float*(图像类型)的等效数据类型是什么?
- 将整数从VB.Net传递到C++dll
- 等效于 VB DLL 函数声明的 C# 返回并返回'Attempted to read or write protected memory'错误
- VB DLL 中的下划线符号是什么