调试c#程序时出现了:未处理的System.Threading.ThreadStopException类型的异常出现在mscorlib.dll中。

Hartmann007 2014-10-23 03:52:11
我用安捷伦的DSO6014L示波器采集一信号,在调试时出现了错误,下面代码是我写的示波器的类,单步调试到第120行时导致异常(取数函数中),直接跳到Catch中了,错误信息大致意思是和示波器没建立连接,不能获取到值(错误图片见后面),可是示波器我连上了啊,而且初始化能通过仪器有反应。不知道怎么回事,求大神指教,谢谢了!
using System;
using Agilent.Agilent546XX.Interop;
using System.Runtime.InteropServices;
using System.Data;
using System.Collections;

namespace Acery.DSO6014L
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
public class DSO6014Class
{
public DSO6014Class()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
Agilent.Agilent546XX.Interop.Agilent546XXClass IviDriver = new Agilent.Agilent546XX.Interop.Agilent546XXClass();
// IAgilent546XXMeasurement pMeasurement;
public double timebase = 0.0;
/// <summary>
/// 初始化函数
/// </summary>
public bool Initialize(string ResourceName)
{
try
{
IviDriver.Initialize(ResourceName,false,true,"");
Configure();
}
catch
{
return false;
}
return IviDriver.Initialized;
}
/// <summary>
/// 关闭示波器
/// </summary>
public bool Close()
{
try
{
IviDriver.Close();
}
catch(Exception ee)
{
Console.WriteLine(ee.Message);
return false;
}
return true;
}
/// <summary>
/// 中止采集
/// </summary>
public bool Abort()
{
try
{
IviDriver.Measurements.Abort();
}
catch
{
return false;
}
return true;
}
/// <summary>
/// 配置示波器各参数
/// </summary>
private bool Configure()
{
try
{
//配置示波器正常取数模式
IviDriver.Acquisition.Type = Agilent546XXAcquisitionTypeEnum.Agilent546XXAcquisitionTypeNormal;
//定义采集的最小点数
IviDriver.Acquisition.NumberOfPointsMin = 1000;
// pMeasurement = IviDriver.Measurements.get_Item("Channel1");
}
catch(Exception ee)
{
Console.WriteLine(ee.Message);
return false;
}
return true;
}
/// <summary>
/// 测峰峰值
/// </summary>
public bool FetchVppValue(ref double resultVpp)
{
try
{
// Configure();
IAgilent546XXMeasurement pMeasurement = IviDriver.Measurements.get_Item("UserChannel1");
IviDriver.Measurements.AutoSetup();
pMeasurement.ReadWaveformMeasurement

(Agilent546XXMeasurementEnum.Agilent546XXMeasurementVoltagePeakToPeak,(Agilent546XXTimeOutEnum)20000,ref resultVpp);
}
catch
{
return false;
}
return true;
}
/// <summary>
/// 取值
/// </summary>
public bool FetchData(ref double[] WaveData)
{
try
{
double dInitialX = 0.0;
double dXIncrement = 0.0;
WaveData = new double[1000];
IAgilent546XXMeasurement pMeasurement = IviDriver.Measurements.get_Item("UserChannel1");
IviDriver.Measurements.AutoSetup();
timebase = IviDriver.Acquisition.TimePerRecord;//timebase值
pMeasurement.ReadWaveform((Agilent546XXTimeOutEnum) 20000, ref(WaveData), ref(dInitialX),

ref(dXIncrement));
}
catch(Exception ee)
{
Console.WriteLine(ee.Message);
return false;
}
return true;
}
/// <summary>
/// 测频率值
/// </summary>
public bool FetchFreq(ref double resultFreq)
{
try
{
// Configure();
IAgilent546XXMeasurement pMeasurement = IviDriver.Measurements.get_Item("UserChannel1");
IviDriver.Measurements.AutoSetup();
pMeasurement.ReadWaveformMeasurement

(Agilent546XXMeasurementEnum.Agilent546XXMeasurementFrequency,(Agilent546XXTimeOutEnum)20000,ref resultFreq);
}
catch
{
return false;
}
return true;
}
}
}

...全文
302 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hartmann007 2014-10-23
  • 打赏
  • 举报
回复
引用 2 楼 Z65443344 的回复:
不要光贴出类的代码 你是如何调用的呢 既然提示你线程正被停止,说明你是在线程中调用的 而这个线程你没有放到类里,而是放到了类外面 你是否在线程中多次调用你这个类,导致其中一个线程打开,另一个线程也要打开 或者代码执行到一半,线程被abort了
我现在做的这个是个测试产品的软件,它有好几个测试项,如:畸变测试,直流测试,交流测试等,每个测试项用了一个线程。其中畸变测试要用6014L示波器(用示波器测产品的输出信号),而畸变测试中有3个小测试项:频响测试、阻抗测试、噪声测试(每个小测试项我单独写个函数),每个函数中先循环通道数,再循环配置的信息点(如频响的为几个频率点),在频率点循环中调用示波器类中那个FetchData()函数。也就畸变这个线程要用到,其他线程不调用这个函数。 下面这个程序是根据测试项来执行各自的线程的,我复制了3个。
if(A615_02Data.m_St_ProjectInfo.prjStatus.currentTestID == TestItemNameIDEnum.CABLE_CONNECT_TEST)
{
	m_IvkDisplayTestLogInfo(false, true, "正在执行电缆连接测试...");	
	this.CableConnectTestThread=newThread(newThreadStart(CableConnectTestThreadBod));
	CableConnectTestThread.IsBackground=false;
	CableConnectTestThread.Start();
}
else if(A615_02Data.m_St_ProjectInfo.prjStatus.currentTestID == TestItemNameIDEnum.MANUAL_MONITOR_TEST)
{
	m_IvkDisplayTestLogInfo(false, true, "正在进行手动监测...");		
	this.ManualTestThread = new Thread(new ThreadStart(ManualTestThreadBody));
	ManualTestThread.IsBackground=false;
	ManualTestThread.Start();
}
else if(A615_02Data.m_St_ProjectInfo.prjStatus.currentTestID == TestItemNameIDEnum.DISTORTION_TEST)
{
	tmpThreadID = 0;
	m_IvkDisplayTestLogInfo(false, true, "正在进行畸变测试...");
	this.VaryTestThread = new Thread(new ThreadStart(VaryTestThreadBody));
	VaryTestThread.IsBackground = false;
	VaryTestThread.Start();
}

// 畸变测试
Thread VaryTestThread;
private void VaryTestThreadBody()
{
	if(A615_02Data.m_St_FlagSelectedTestItem[(int)TestItemNameIDEnum.FREQUENCY_TEST])//频响
	{
		m_IvkDisplayTestLogInfo(false, true, "正在执行畸变测试中的频响测试...");
		FreqTestForVary();
	}		
      if(A615_02Data.m_St_FlagSelectedTestItem[(int)TestItemNameIDEnum.OUTPUT_AC_IMPEDANCE_TEST])//阻抗
	{
		m_IvkDisplayTestLogInfo(false, true, "正在执行畸变测试中的阻抗测试...");
		OutAcImpedanceTestForVary();	
				
	}
}
//畸变中的频响测试(先循环通道,再循环频率点)
private void FreqTestForVary()
{
     for(int iChl = 0;(iChl < A615_02Data.m_St_ProjectInfo.outputChlCount)&&(!m_FlagAbortTest);iChl++)
     {
            for(int iFreq = 0; (iFreq < tmpFreqParams[iChl].requiredACSignals.Length) && (!m_FlagAbortTest); iFreq++)
	       {
                   DSO6014Driver.FetchData(ref WaveData); //调用示波器取值函数
            }
     }
}
於黾 2014-10-23
  • 打赏
  • 举报
回复
不要光贴出类的代码 你是如何调用的呢 既然提示你线程正被停止,说明你是在线程中调用的 而这个线程你没有放到类里,而是放到了类外面 你是否在线程中多次调用你这个类,导致其中一个线程打开,另一个线程也要打开 或者代码执行到一半,线程被abort了
rokerker 2014-10-23
  • 打赏
  • 举报
回复
不是很懂啊,感觉很高端。 瞎猜下啊,机器是不是有个debug模式,要在设置里面或者控制面板之类的地方开启,不然你的程序不能正常连接呢,就跟安卓手机要开开发模式差不多的东西。 你试试

110,539

社区成员

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

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

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