C#多次调用DLL结果不一致

王大大大锤 2015-05-04 02:43:38
用周立功的USBCAN库做二次开发,调用dll中的一个函数(Do_VCI_StartCAN(),见下)时,在我电脑上用几次会随机的出现一两次不成功,换一台电脑就没有这种情况。

private void Window_Loaded(object sender, RoutedEventArgs e)
{
VCI_Return_Status re = 0;
try
{
re = this.vm_binding.vm_caninstance.Do_VCI_OpenDevice();
if (re == VCI_Return_Status.STATUS_OK)
{
this.lbl_status.Content = "打开设备成功";

re = this.vm_binding.vm_caninstance.Do_VCI_StartCAN();//就是这里
if (re == VCI_Return_Status.STATUS_OK)
{
this.lbl_status.Content = "开始接收CAN数据...";
this.vm_binding.vm_timer.Start();
this.DataSaveTimer.Start();
}
else
{
this.lbl_status.Content = "开始接收数据失败。请检查设备连接是否正确,然后重新启动程序。";
this.vm_binding.vm_timer.Stop();
this.DataSaveTimer.Stop();
}
}
else
{
this.lbl_status.Content = "打开设备失败,请检查设备是否正确连接PC,是否正确安装设备驱动";
}

}
catch (Exception excp)
{
StringBuilder sb = new StringBuilder();
sb.Append("打开设备异常:").Append(excp.Message);
// this.lbl_status.Content = sb.ToString();
}
}


单步过的时候是OK的,想请问调用一个DLL时,出现结果不一致的原因一般有哪些,除了单步运行还有什么办法可以查
非常感谢!
...全文
529 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
泡泡龙 2015-05-07
  • 打赏
  • 举报
回复
引用 7 楼 hit_wxh 的回复:
[quote=引用 1 楼 liucqa 的回复:] 你可以在代码里面延时1秒重试。
我试了一下只要有延时,甚至10ms都可以不再返回失败,所以考虑是连续对设备操作的时候设备反应不过来,然后用楼下的办法用getlasterror输出日志,出错的时候提示为997,重叠 I/O 操作在进行中,这是否说明确实是需要等待设备呢? [/quote] 应该可以查询设备状态吧
王大大大锤 2015-05-05
  • 打赏
  • 举报
回复
引用 2 楼 lichjx 的回复:
弄个Log4net什么的写日志,把运行状况记下来,然后分析程序运行出问题时的环境上下文,如果多线程,共享资源加个锁,测一下还有没有问题,出问题时记录下线程号或端口资源使用状况,看是不是并发引起的。
非常感谢!新技能GET 整个程序里面除了两个定时器以外没有别的子线程了,而两个定时器都是在这里成功之后才开启,所以我觉得应该不是并发的原因
王大大大锤 2015-05-05
  • 打赏
  • 举报
回复
引用 1 楼 liucqa 的回复:
你可以在代码里面延时1秒重试。
我试了一下只要有延时,甚至10ms都可以不再返回失败,所以考虑是连续对设备操作的时候设备反应不过来,然后用楼下的办法用getlasterror输出日志,出错的时候提示为997,重叠 I/O 操作在进行中,这是否说明确实是需要等待设备呢?
  • 打赏
  • 举报
回复
有什么办法可以查? 其实就是用心去设计测试用例,设计不同角度的测试用例,保证并发多线程模拟测试,保证每天至少运行1000遍测试,保证在开发中一旦修改一些代码就进行回归测试。这些做到了,就算是一个比较合格的“查结果不一致”的成熟的程序员了。
  • 打赏
  • 举报
回复
引用 楼主 hit_wxh 的回复:
单步过的时候是OK的,想请问调用一个DLL时,出现结果不一致的原因一般有哪些,除了单步运行还有什么办法可以查 非常感谢!
测试的思路跟随便尝试使用是不一样的。设计测试用例需要有“想象力”,例如一个人只有想到了要在3秒钟内保证模拟10个人非常平均而准确地并发操作,他才能发现一些深度问题。所以好的测试人员是非常好的产品经理的人选,就是这不是一般的人可以随便糊弄一下领导、随便“点点点”地简单地所谓单步就行了。 带着目的、故意要把压力作用到系统中(可能的)某个机制上,这样的人才能发现系统70%的问题。而随随便便胡乱“单步运行”的人,往往只能发现10%的问题,然后就再也懒得去测试了。
  • 打赏
  • 举报
回复
遇到困难而临时磨枪,谁也没有什么简单的解决办法。 只能是“把随机变为必然”,你能找到以任何方法序列、到任何人的机器、使得10次中至少有7次能够重现问题,这时候才能开始解决问题。否则你要做的就是把“随机变成必然”的这种初级的工作,它很重要而且经常是浪费大量时间,但是不这样办就不能发现问题。 所以好的产品都把以前的几百个深度的问题写成了自动化测试用例,使得以后可以随时拿出来对产品进行质量控制之用。而如果一个产品是小作坊做的,那么就更容易遇到翻车、令人想放弃的bug。
江南小鱼 2015-05-04
  • 打赏
  • 举报
回复
引用 楼主 hit_wxh 的回复:
用周立功的USBCAN库做二次开发,调用dll中的一个函数(Do_VCI_StartCAN(),见下)时,在我电脑上用几次会随机的出现一两次不成功,换一台电脑就没有这种情况。

private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            VCI_Return_Status re = 0;
            try
            {
                re = this.vm_binding.vm_caninstance.Do_VCI_OpenDevice();
                if (re == VCI_Return_Status.STATUS_OK)
                {
                    this.lbl_status.Content = "打开设备成功";
                    
                    re = this.vm_binding.vm_caninstance.Do_VCI_StartCAN();//就是这里
                    if (re == VCI_Return_Status.STATUS_OK)
                    {
                        this.lbl_status.Content = "开始接收CAN数据...";
                        this.vm_binding.vm_timer.Start();
                        this.DataSaveTimer.Start();
                    }
                    else
                    {
                        this.lbl_status.Content = "开始接收数据失败。请检查设备连接是否正确,然后重新启动程序。";
                        this.vm_binding.vm_timer.Stop();
                        this.DataSaveTimer.Stop();
                    }
                }
                else
                {
                    this.lbl_status.Content = "打开设备失败,请检查设备是否正确连接PC,是否正确安装设备驱动";
                }

            }
            catch (Exception excp)
            {
                StringBuilder sb = new StringBuilder();
                sb.Append("打开设备异常:").Append(excp.Message);
                // this.lbl_status.Content = sb.ToString();
            }
        }
单步过的时候是OK的,想请问调用一个DLL时,出现结果不一致的原因一般有哪些,除了单步运行还有什么办法可以查 非常感谢!
加log,记录下每次调用的相关参数,拿这些参数进行调试,看复现么?
lichjx 2015-05-04
  • 打赏
  • 举报
回复
弄个Log4net什么的写日志,把运行状况记下来,然后分析程序运行出问题时的环境上下文,如果多线程,共享资源加个锁,测一下还有没有问题,出问题时记录下线程号或端口资源使用状况,看是不是并发引起的。
泡泡龙 2015-05-04
  • 打赏
  • 举报
回复
你可以在代码里面延时1秒重试。

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧