C# 用C语言实现OCR的多线程处理#
我需要一个关于WinForms C应用程序中多线程实现的建议。我们有一个图像-包含文本和数字,并且有单独的方法来识别不同类型的数据。例如:C# 用C语言实现OCR的多线程处理#,c#,multithreading,ocr,C#,Multithreading,Ocr,我需要一个关于WinForms C应用程序中多线程实现的建议。我们有一个图像-包含文本和数字,并且有单独的方法来识别不同类型的数据。例如: decimal[] numbers = getNumbers(bitmap, dictionary1); string[] text = getText(bitmap, dictionary2); int[] integers = getInts(bitmap, dictionary3); // add 5 more data types (list, in
decimal[] numbers = getNumbers(bitmap, dictionary1);
string[] text = getText(bitmap, dictionary2);
int[] integers = getInts(bitmap, dictionary3);
// add 5 more data types (list, int[], etc..)
因此,整个过程大约需要1秒。
我在考虑在不同的线程上同时运行OCR。因此,我尝试使用任务工厂:
decimal[] numbers;
Task.Factory.StartNew(() =>
{numbers = getNumbers(bitmap, dictionary1);});
string[] text;
Task.Factory.StartNew(() =>
{text = getText(bitmap, dictionary2);});
textBox1.Text = "" + text[0]; // nothing
但是我没有得到任何结果
那么在我的情况下可以实现多线程吗?我必须使用哪种方法
- 任务工厂
- 背景工作者
- 线程
- 还是别的什么
textBox1.Text = "" + text[0];
执行速度比
string[] text;
Task.Factory.StartNew(() =>
{text = getText(bitmap, dictionary2);});
这就是文本框字段为空的原因。。所以我在代码的最后移动了“textBox1.Text=”“+Text[0];”,最后得到了结果
编辑2:
好的,任务没有任何区别。。如果没有它们,我会得到相同的速度测试结果。你正确地开始了任务,但你永远不会等待它们完成。你想做的事情和你想做的事情相似
Task[] tasks = new Task[2];
decimal[] numbers;
tasks[0] = Task.Factory.StartNew(() =>
{numbers = getNumbers(bitmap, dictionary1);});
string[] text;
tasks[1] = Task.Factory.StartNew(() =>
{text = getText(bitmap, dictionary2);});
Task.WaitAll(tasks); // Wait for all parallel tasks to finish
// before using their output.
textBox1.Text = "" + text[0];
可以找到更多示例代码
或者,您可以从任务返回值,而不是将其分配给变量,并在访问时使用该变量将等待任务完成并返回任务结果。您的实际代码是否等待任务完成?任务没有任何区别。。没有它们我也能得到同样的速度测试结果。@Alex在没有看到新代码的情况下很难解释,但是您是否先启动所有任务,然后在它们全部运行后访问结果?如果您在开始下一个任务之前分别等待每个任务的结果,则会得到相同的效果。我完全按照您的示例中的方式启动它们:run1、run2、run3->>>WaitAll。然后我将收集到的信息放入文本框中。这还不是全部。第一次运行时没有任何错误,但是当我第二次运行代码时,我得到了“对象引用未设置为对象的实例”。(除非将麻烦的行放入单独的任务[])对不起,我的错误。最后,我知道是什么导致了我所说的这个错误。。性能提高了200+毫秒,这不是一个坏结果。。这一切都比一秒钟好;)