首页 新闻 会员 周边

线程中调用了非托管代码,线程的关闭问题

0
[待解决问题]

在设计程序过程中,需要开启一个线程用来异步获取相机的采集函数。当相机的模式设置为硬件触发时,线程会在获取相机图片中暂停直到外部触发相机imageShow = GetOneImage()。这时关闭线程会出现卡死现象。
public void GrabImage(CancellationTokenSource cancel)
{
while (!cancel.IsCancellationRequested)
{
HObject imageShow = null;
imageShow = GetOneImage();
。。。。
}
}

问题:如果线程调用函数中用到了非托管代码,执行过程中卡死在非托管代码中(不能修改),有什么方式可以关闭线程。
使用了Task的CancellationTokenSource也没用

朴树的扑的主页 朴树的扑 | 菜鸟二级 | 园豆:202
提问于:2018-10-15 16:03
< >
分享
所有回答(3)
-1

cancel.cancelafter(3s)

czd890 | 园豆:14412 (专家六级) | 2018-10-15 16:09

试过cancel.cancle()无法关闭,CancleAfter()没试过

支持(0) 反对(0) 朴树的扑 | 园豆:202 (菜鸟二级) | 2018-10-15 16:12

@朴树的扑: 关闭的是你在托管线程内的资源。
非托管资源要看你的GetOneImage方法里面调用的非托管方法是否有返回句柄,且提供了清理方法。

支持(0) 反对(0) czd890 | 园豆:14412 (专家六级) | 2018-10-15 16:16

@朴树的扑: 这时关闭线程会出现卡死现象
是关闭当前进程吗?如果是是上面的回复忽略

支持(0) 反对(0) czd890 | 园豆:14412 (专家六级) | 2018-10-15 16:18

@czd890:GetOneImage方法 主要是 HOperatorSet.GrabImageAsync(out image, CameraHande, -1);如果外部没有触发相机的话,会一直卡在这句话,后面的执行不下去的

支持(0) 反对(0) 朴树的扑 | 园豆:202 (菜鸟二级) | 2018-10-15 16:18

@czd890: CancleAfter是定时关闭吧

支持(0) 反对(0) 朴树的扑 | 园豆:202 (菜鸟二级) | 2018-10-15 16:19
0

你是怎么开线程的?

dudu | 园豆:31007 (高人七级) | 2018-10-15 16:25

grabTask = new Task(() => { GrabImage(cancelation); }, cancelation.Token);
grabTask.Start();

支持(0) 反对(0) 朴树的扑 | 园豆:202 (菜鸟二级) | 2018-10-15 16:26

@朴树的扑: 首先试试把 GrabImage(CancellationTokenSource cancel) 的返回值类型改为 Task

public Task GrabImage(CancellationTokenSource cancel)
{
    //...
}
支持(0) 反对(0) dudu | 园豆:31007 (高人七级) | 2018-10-15 16:31

@dudu: 没明白这么做的用意,能麻烦解释一下吗。比较菜233

支持(0) 反对(0) 朴树的扑 | 园豆:202 (菜鸟二级) | 2018-10-15 17:16
0
GetOneImage()有没有对应的异步方法,采用异步方式获取就不会阻塞了
truestar | 园豆:204 (菜鸟二级) | 2020-04-10 17:07
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册