在设计程序过程中,需要开启一个线程用来异步获取相机的采集函数。当相机的模式设置为硬件触发时,线程会在获取相机图片中暂停直到外部触发相机imageShow = GetOneImage()。这时关闭线程会出现卡死现象。
public void GrabImage(CancellationTokenSource cancel)
{
while (!cancel.IsCancellationRequested)
{
HObject imageShow = null;
imageShow = GetOneImage();
。。。。
}
}
问题:如果线程调用函数中用到了非托管代码,执行过程中卡死在非托管代码中(不能修改),有什么方式可以关闭线程。
使用了Task的CancellationTokenSource也没用
cancel.cancelafter(3s)
试过cancel.cancle()无法关闭,CancleAfter()没试过
@朴树的扑: 关闭的是你在托管线程内的资源。
非托管资源要看你的GetOneImage方法里面调用的非托管方法是否有返回句柄,且提供了清理方法。
@朴树的扑: 这时关闭线程会出现卡死现象
是关闭当前进程吗?如果是是上面的回复忽略
@czd890:GetOneImage方法 主要是 HOperatorSet.GrabImageAsync(out image, CameraHande, -1);如果外部没有触发相机的话,会一直卡在这句话,后面的执行不下去的
@czd890: CancleAfter是定时关闭吧
你是怎么开线程的?
grabTask = new Task(() => { GrabImage(cancelation); }, cancelation.Token);
grabTask.Start();
@朴树的扑: 首先试试把 GrabImage(CancellationTokenSource cancel)
的返回值类型改为 Task
public Task GrabImage(CancellationTokenSource cancel)
{
//...
}
@dudu: 没明白这么做的用意,能麻烦解释一下吗。比较菜233