问题描述
如题,这个问题我已经纠结了快三个工作日了。我不同WinFrom程序一起动就会开启10个线程,并发对10张图片进行算法处理,问题是只要程序一起动就会报“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”异常。我试过将8个线程停掉,只开两个,发现没有问题,开三个四个偶尔会出问题....反正10个一个开是一定会报异常的。开起来好像是线程开太多CPU反应不过来导致的问题,可是CPU反应不过来就会报“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”异常吗?我在网上查了查这种多线程并发报异常的问题很可能是线程与线程间有共享资源导致的问题,我倒觉得没有共享什么资源啊,各位高手帮我看看我的线程处理函数里面存在共享资源吗?线程1的线程处理函数:privatevoidAlgorithmHandlerThreadMethod1(){Bitmaptest1=newBitmap("E:\和路雪\和路雪2014-7-09\TestControl\蛋筒\1.jpg");ProjectCalculationtestHalcon=newProjectCalculation();ConesInspectionHalcon01ParameterIn=newConesInspectionHalcon01();ConesInspectionHalcon01ParameterOut=newConesInspectionHalcon01();ParameterIn.AreaAddSet=50000;ParameterIn.MaxAreaSet=350;ParameterIn.MaxEdgeSet=150;ParameterIn.AreaCutSet=40000;while(true){if(threadFlag){longstart=DateTime.Now.Ticks;ProjectCalculation.ConesInspectionHalcon01(test1,ParameterIn,outParameterOut);Thread.Sleep(1000);}}}
线程2的线程处理函数:privatevoidAlgorithmHandlerThreadMethod2(){Bitmaptest2=newBitmap("E:\和路雪\和路雪2014-7-09\TestControl\蛋筒\2.jpg");ProjectCalculationtestHalcon=newProjectCalculation();ConesInspectionHalcon01ParameterIn=newConesInspectionHalcon01();ConesInspectionHalcon01ParameterOut=newConesInspectionHalcon01();ParameterIn.AreaAddSet=50000;ParameterIn.MaxAreaSet=350;ParameterIn.MaxEdgeSet=150;ParameterIn.AreaCutSet=40000;while(true){if(threadFlag){longstart=DateTime.Now.Ticks;ProjectCalculation.ConesInspectionHalcon02(test2,ParameterIn,outParameterOut);Thread.Sleep(1000);}}}
线程3、4....10的线程处理函数一次类推。ConesInspectionHalcon01函数:publicstaticvoidConesInspectionHalcon01(Bitmapbitmap,ConesInspectionHalcon01ParameterIn,outConesInspectionHalcon01ParameterOut){Bitmapbm=(Bitmap)bitmap.Clone();Stopwatchsw=newStopwatch();sw.Start();HDevelopExporthe=newHDevelopExport();BitmapDatabd=bm.LockBits(newRectangle(0,0,bm.Width,bm.Height),ImageLockMode.ReadWrite,PixelFormat.Format24bppRgb);IntPtrintp=bd.Scan0;Bitmapb1=newBitmap(bm.Width,bm.Height,PixelFormat.Format8bppIndexed);Bitmapb2=newBitmap(bm.Width,bm.Height,PixelFormat.Format8bppIndexed);Bitmapb3=newBitmap(bm.Width,bm.Height,PixelFormat.Format8bppIndexed);BitmapDatabd1=b1.LockBits(newRectangle(0,0,bm.Width,bm.Height),ImageLockMode.ReadWrite,PixelFormat.Format8bppIndexed);BitmapDatabd2=b2.LockBits(newRectangle(0,0,bm.Width,bm.Height),ImageLockMode.ReadWrite,PixelFormat.Format8bppIndexed);BitmapDatabd3=b3.LockBits(newRectangle(0,0,bm.Width,bm.Height),ImageLockMode.ReadWrite,PixelFormat.Format8bppIndexed);IntPtrintp1=bd1.Scan0;IntPtrintp2=bd2.Scan0;IntPtrintp3=bd3.Scan0;unsafe{Work.Correction.RGBToChannel(intp,intp1,intp2,intp3,bm.Width,bm.Height);}sw.Stop();stringtmp=sw.ElapsedMilliseconds.ToString();Console.WriteLine(tmp);sw.Reset();//label2.Text=tmp;bm.UnlockBits(bd);HImageh1=newHImage();HImageh2=newHImage();HImageh3=newHImage();HTupleAreaCut,MaxArea,MaxEdge,AreaAdd;HTuplehv_Gray,hv_Deviation;sw.Start();h1.GenImage1("byte",bm.Width,bm.Height,intp1);h2.GenImage1("byte",bm.Width,bm.Height,intp2);h3.GenImage1("byte",bm.Width,bm.Height,intp3);sw.Stop();tmp=sw.ElapsedMilliseconds.ToString();Console.WriteLine(tmp);sw.Reset();try{sw.Start();he.ScaleCircle(h1,h2,h3,outAreaAdd,outMaxArea,outMaxEdge,outAreaCut,outhv_Gray,outhv_Deviation);sw.Stop();tmp=sw.ElapsedMilliseconds.ToString();Console.WriteLine(tmp);sw.Reset();}catch(Exceptionex){AreaAdd=1000000;MaxArea=1000000;MaxEdge=1000000;AreaCut=1000000;hv_Gray=0;hv_Deviation=0;}if(hv_Gray.D<=30){AreaAdd=1000000;MaxArea=1000000;MaxEdge=1000000;AreaCut=1000000;}ParameterOut=newConesInspectionHalcon01();//ParameterOut=ParameterIn;ParameterOut.CurrentAreaAdd=AreaAdd;ParameterOut.CurrentAreaCut=AreaCut;ParameterOut.CurrentMaxEdge=MaxEdge;ParameterOut.CurrentMaxArea=MaxArea;ParameterOut.hv_Gray=hv_Gray;//ParameterOut.hv_Deviation=hv_Deviation;h1.Dispose();h2.Dispose();h3.Dispose();b1.UnlockBits(bd1);b2.UnlockBits(bd2);b3.UnlockBits(bd3);b1.Dispose();b2.Dispose();b3.Dispose();if(ParameterOut.CurrentAreaAdd>ParameterIn.AreaAddSet||ParameterOut.CurrentMaxArea>ParameterIn.MaxAreaSet||ParameterOut.CurrentMaxEdge>ParameterIn.MaxEdgeSet||ParameterOut.CurrentAreaCut>ParameterIn.AreaCutSet){ParameterOut.Result=false;ParameterOut.Index=10;}else{ParameterOut.Result=true;ParameterOut.Index=11;}//ParameterOut.Index=ParameterIn.Index;if(bm!=null){bm.Dispose();}}
ConesInspectionHalcon02ConesInspectionHalcon03...ConesInspectionHalcon10和ConesInspectionHalcon01内容是一样的。
解决方案
本帖最后由 bleachyin1991 于 2015-11-02 16:56:40 编辑
解决方案二:
还望高手指点迷经啊~~~
解决方案三:
wo我也遇到此类问题了
解决方案四:
首先GDI+对多线程支持就不好,一般的建议是,如果需要通过GDI+并发进行图像处理,不要使用多线程,而是使用多进程方式。其次如果还使用了第三方库(包括托管的和非托管的),它们也必须线程安全才行。GDI+的毛病非常多,长期重要的任务尽量不要依赖它,而是使用其它图像处理库。