none
同样程序,单步调试和直接执行有不同的结果 RRS feed

  • 问题

  • 我用事件驱动的形式对硬件发送命令,当我用单步调试的时候,执行没有错误,但是当我直接执行的时候,却有时候出现打开模态对话框失败的情况。具体如下:

    在单步调试时候,获得的GetLastError的值为0,成功,但是当直接执行的时候,错误码会有ERROR_PATH_NOT_FOUND,在关闭该对话框的时候,出现ERROR_INVALID_WINDOW_HANDLE,我看了我定义的HANDLE句柄以及全局变量,在调试的时候,没有什么变化,但是当打开另一个对话框进行发送命令的时候,就会出现错误,也就是该内存不能为read。还有就是在WriteFile之后,如果要是用AfxMessageBox()显示一下error号码,会显示ERROR_IO_PENDING,之后error就是0了。

    我实在是搞不懂,请高手帮我分析一下原因,或者给出一些针对此问题的调试建议。

    非常的感谢!

    2010年4月10日 9:28

答案

  • 这个问题是和时间有关的,慢速设备需要等待时间。

    ERROR_IO_PENDING这个错误是因为你在使用异步模式读取设备,IO在等待设备返回,你需要使用异步模式的方式去获取数据。

    如果你对异步不熟悉或者你的程序不需要特别高的性能,建议你使用同步模式,这样必须有数据可读才会返回,就不会有这种问题了。

    ERROR_INVALID_WINDOW_HANDLE的问题应该是你在窗口调用的时候访问了已经释放的窗口,这个问题可能是由于多线程导致的很不好找错误原因,你只能通过打日志的方法来找问题而不是单步调试。


    0xBAADF00D
    • 已标记为答案 神秘人 2010年4月12日 2:01
    2010年4月10日 12:58
    版主

全部回复

  • 这个问题是和时间有关的,慢速设备需要等待时间。

    ERROR_IO_PENDING这个错误是因为你在使用异步模式读取设备,IO在等待设备返回,你需要使用异步模式的方式去获取数据。

    如果你对异步不熟悉或者你的程序不需要特别高的性能,建议你使用同步模式,这样必须有数据可读才会返回,就不会有这种问题了。

    ERROR_INVALID_WINDOW_HANDLE的问题应该是你在窗口调用的时候访问了已经释放的窗口,这个问题可能是由于多线程导致的很不好找错误原因,你只能通过打日志的方法来找问题而不是单步调试。


    0xBAADF00D
    • 已标记为答案 神秘人 2010年4月12日 2:01
    2010年4月10日 12:58
    版主
  • 谢谢版主的回答。

    我想问一下,怎么通过打日志的方法来找问题?因为我以前没有用过,也不知道从何处下手,请详细说明一下如何设置、步骤和查看哪里有什么不同。

    2010年4月11日 0:39
  • 你可以使用OutputDebugString或者自己写一个写文件的日志函数。

    日志就是里面有时间的一个字符串,这样在复杂的情况下你可以看到当前程序内部运行真正的先后顺序。

     


    0xBAADF00D
    2010年4月11日 5:23
    版主