我在C#中的应用程序WPF使用C ++库中的API进行图像处理。我需要一次处理六个图像,因为这有六个对象可用。 准备好图像进行处理时,会将其分配给线程池中的线程。下面的代码用于此目的。
ThreadPool.QueueUserWorkItem(ThreadPoolCallback, imageTuple);
在“ ThreadPoolCallback”中,正在调用图像处理API。
关于我的问题,在我的开发笔记本电脑中,仅执行API的时间为3-3.5秒。但是,如果在具有更好规格的IPC的自动化系统中执行相同的代码,则API执行时间将缩短至8-9秒。
我的开发机器具有8核处理器和16 GB内存 自动化系统中的IPC具有14个核心处理器和32 GB内存。
我已经检查了一些基本内容,例如内存增加,CPU使用率提高。但他们都没有表现出任何担忧。两种系统的唯一区别是IPC已安装了NI Labview。
正在寻找一些建议来缩短我的并行执行时间。是否可以使用专用内核或其他任何内核。
预先感谢
ThreadPool.QueueUserWorkItem(ThreadPoolCallback, imageTuple);
public void ThreadPoolCallback(Object threadContext)
{
try
{
var result = visionProcessingUnit.ExecuteInspection(imageTuple.Item3, imageTuple.Item2.ImageData, VIBitmap.Width, VIBitmap.Height);;
}
catch (Exception ex)
{
Logger.Exception("VisionHandler.cs", ex);
}
}
答案 0 :(得分:0)
首先,您应该确保实时系统真正更快地处理6个线程。您可以在两个系统上下载并解压缩7zip,并通过6个线程从命令行运行一些基准测试:
7z b -mmt6
答案 1 :(得分:0)
ThreadPool线程不适用于长时间运行的任务,可能会被某些网络框架进程占用。通常,每个CPU在线程池中有250个线程可用。另外,您可以检查您是否在方法中锁定了某些代码,从而阻止了线程池调度。
如果任务很耗时,我建议您不要使用线程池线程。
下面是两个可以使用的选项,它们将使用新线程而不是线程池一个。
var imageTuple = "blqhblah";
Task.Factory.StartNew(() => ThreadPoolCallback(imageTuple),TaskCreationOptions.LongRunning);
和
var thread=new Thread(()=>ThreadPoolCallback(imageTuple));
thread.Priority = ThreadPriority.AboveNormal;
thread.Start();