C# 10个线程并发执行Halcon图像算法 报“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”

问题描述

如题,这个问题我已经纠结了快三个工作日了。我不同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+的毛病非常多,长期重要的任务尽量不要依赖它,而是使用其它图像处理库。

时间: 2024-07-30 06:23:48

C# 10个线程并发执行Halcon图像算法 报“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”的相关文章

谁有多线程代码!!我想实现10个线程同时执行一个方法!

问题描述 我想10个线程同时执行一个方法,但是每个方法传入的参数是不一样的!我在网上找了些代码,但是不行,造成线程混乱,谁能教教我啊!!想要实现的是:10个线程同时去登陆网站,然后采集东西.当然我也有10个用户名.10个线程每个线程对应一个用户. 解决方案 解决方案二:分太少了.不然老夫贴出来解决方案三:ThreadPool.QueueUserWorkItem();解决方案四:给你个多线程的例子privatevoidbtnDataUp_Click(objectsender,RoutedEvent

C#线程 在某一时间内,只有N个线程在并发执行,其余都在队列中的实现

执行   上司交代要做一个小测试 具体的需求是 在某一时间点,只有N个线程在并发执行,如果有多余的线程,则排队等候~ 还真是费尽心思啊~最终还是被我攻克了~ 下面我就来说说具体的实现 C#提供了Mutex与Interlocked这两个与线程相关的类,都在Threading命名空间下~! Mutex中提供了WiteOne,ReleaseMutex 两个实例方法~ WiteOne的作用是"阻塞当前线程,提供对该线程的原子操作" 也就是说当一个线程遇到WiteOne的时候,如果在WiteOn

Java多线程:“基础篇”10之线程优先级和守护线程

1. 线程优先级的介绍 java 中的线程优先级的范围是1-10,默认的优先级是5."高优先级线程"会优先于 "低优先级线程"执行. java 中有两种线程:用户线程和守护线程.可以通过isDaemon()方法来区别它们:如果返回false, 则说明该线程是"用户线程":否则就是"守护线程". 用户线程一般用户执 行用户级任务,而守护线程也就是"后台线程",一般用来执行后台任务.需要注意的是: Java虚拟

ConcurrencyMode.Multiple 模式下的WCF服务就一定是并发执行的吗:探讨同步上下文对并发的影响[下篇]

在<上篇>中,我通过一个具体的实例演示了WCF服务宿主的同步上下文对并发的影响,并简单地介绍了同步上下文是什么东东,以及同步上下文在多线程中的应用.那么,同步上下文在WCF并发体系的内部是如何影响服务操作的执行的呢?这实际上涉及到WCF的一个话题,即线程的亲和性(Thread Affinity),本篇文章将为你剖析WCF线程亲和机制的本质. 一.WCF线程亲和性(Thread Affinity) 对于服务端来说,WCF消息监听和接收体系通过IO线程池并发的处理来自客户端的服务调用请求,所以并发

ConcurrencyMode.Multiple模式下的WCF服务就一定是并发执行的吗:探讨同步上下文对并发的影响[上篇]

在<并发与实例上下文模式>中,我们通过实例演示的方式讲述了基于不同实例上下文模式的并发行为.对于这个实例中的服务类型CalculatorService,读者应该还记得我们对它进行了特别的定义:通过ServiceBehaviorAttribute特性将属性将UseSynchronizationContext设置成False.至于为何要这么做,这就是本篇文章需要为你讲述的内容.为了让读者对本节介绍的内容有一个深刻的认识,我们不然去掉ServiceBehaviorAttribute特性的UseSyn

《CUDA C编程权威指南》——3.2节理解线程束执行的本质

3.2 理解线程束执行的本质 启动内核时,从软件的角度你看到了什么?对于你来说,在内核中似乎所有的线程都是并行地运行的.在逻辑上这是正确的,但从硬件的角度来看,不是所有线程在物理上都可以同时并行地执行.本章已经提到了把32个线程划分到一个执行单元中的概念:线程束.现在从硬件的角度来介绍线程束执行,并能够获得指导内核设计的方法.3.2.1 线程束和线程块 线程束是SM中基本的执行单元.当一个线程块的网格被启动后,网格中的线程块分布在SM中.一旦线程块被调度到一个SM上,线程块中的线程会被进一步划分

《CUDA C编程权威指南》——3.2 理解线程束执行的本质

3.2 理解线程束执行的本质 启动内核时,从软件的角度你看到了什么?对于你来说,在内核中似乎所有的线程都是并行地运行的.在逻辑上这是正确的,但从硬件的角度来看,不是所有线程在物理上都可以同时并行地执行.本章已经提到了把32个线程划分到一个执行单元中的概念:线程束.现在从硬件的角度来介绍线程束执行,并能够获得指导内核设计的方法. 3.2.1 线程束和线程块 线程束是SM中基本的执行单元.当一个线程块的网格被启动后,网格中的线程块分布在SM中.一旦线程块被调度到一个SM上,线程块中的线程会被进一步划

linux中sbt 中单元测试并发执行例子

此次研究的目的原本是要使得 Play Framwork 2 中单元测试能够并发执行, 包括 JUnit 和 Spec 的测试用例, Play 2 的 activator 就是一个 sbt 的包装. 开发中发现我们 Play 2 中的单元测试是按序执行的, 实际上 sbt 下测试用例默认是并发执行的. 之所以 Play 2 的单元测试是按序的, 是因为 activator 设置了把 sbt 的两个属性 fork in Test := true 和 parallelExecution in Test

如何根据类名列表动态创建执行ExecutorService 来并发执行

问题描述 public class SingleThread implements Runnable { ... }public static void main(String[] args){ ExecutorService parallelTest = Executors.newFixedThreadPool(10);for(int i=0; i<1; i++){System.out.println("Thread " + i + " launching now&q