winform 多线程问题:调用摄像头,并进行检测

.Net技术 码拜 3年前 (2017-04-17) 425次浏览
计时器里获得摄像头画面,然后做检测
Bitmap bmp;
Thread thread;
public Form1(){
…//一些初始化
thread = new Thread(new ThreadStart(DoSomething));
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e){
bmp=GetPic();//获得一张图
…//原图显示到窗体
}
DoSomething是检测的部分,bmp是需要检测的原图,现在的问题是怎么把bmp传到DoSomething里面去检测,由于是计时器循环获取bmp,所以既要保证检测时候源(bmp)不变,又要确保内存不会爆满(试过线程new操作放计时器里,每次传bmp,然后内存就一路狂飙。也试过把图片放到队列里再检测,也是一样。)。求帮忙,非常感谢!
解决方案

5

bmp没释放吧,或你等等gc运行完毕看看内存

16

private void timer1_Tick(object sender, EventArgs e)
{
        bmp=GetPic();//获得一张图
        ...//原图显示到窗体
        Task.Run(() => DoSomething(bmp));
}
private Bitmap GetPic()
{
        ....    
}
private void DoSomething(Bitmap bmp)
{
        using (bmp)
        {
            ....
            ....
        }
}

4

线程处理完图片,应该自动结束,处理完毕的图片也要从内存中清理了。

5

内存没释放。
或,你太快了。还没等到gc回收,就已经内存撑爆了。

2

public void run()
{
while(true)
{
Thread.Sleep(1000);
bmp=GetPic();
DoSomething(bmp)
}
}

ThreadStart  ts1 = new ThreadStart(this.run);
var  线程 = new Thread(ts1);
线程.Start();

8

private void timer1_Tick(object sender, EventArgs e)
{
    bmp = GetPic();//获得一张图
    ThreadPool.QueueUserWorkItem(h =>
    {
        检测你的bmp;
    });
    ...//原图显示到窗体
}

不需要多余地弄什么“死循环”的所谓线程。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明winform 多线程问题:调用摄像头,并进行检测
喜欢 (0)
[1034331897@qq.com]
分享 (0)