计时器里获得摄像头画面,然后做检测
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,然后内存就一路狂飙。也试过把图片放到队列里再检测,也是一样。)。求帮忙,非常感谢!
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回收,就已经内存撑爆了。
或,你太快了。还没等到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();
{
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; }); ...//原图显示到窗体 }
不需要多余地弄什么“死循环”的所谓线程。