0

我正在用 c# 编写代码来进行图像处理。我想使用线程,我想 WPF 应用程序中的线程略有不同。我试图运行线程,但它只在函数为 void() 时才有效,即不接受任何参数。

但是,我的功能需要 3 个这样的争论

frame_extract.Frame_Processing(_colorFrame_, widht, height);

因此,以下内容不起作用

depth_Threads = new System.Threading.Thread(**) since ** takes on void() type.

也许我遗漏了一些东西,但我的问题是如何使用线程来处理带参数的函数。

4

5 回答 5

2

也许你可以使用 TPL。

它应该是这样的:

Task.Factory.StartNew(() => frame_extract.Frame_Processing(_colorFrame_, widht, height));

但请注意,您可能必须编组到 ui 线程。

如果您想在 ui 线程中创建线程并希望新线程与提到的 ui 线程进行交互,那么应该可以使用以下内容:

var task = new Task(() => frame_extract.Frame_Processing(_colorFrame_, widht, height));
task.Start(TaskScheduler.FromCurrentSynchronizationContext());

那应该行得通。

于 2013-06-12T10:05:28.723 回答
1

我不是 100% 确定这是否是你想要的,但我认为你需要这样做:

depth_Threads = new System.Threading.Thread(()=>frame_extract.Frame_Processing(_colorFrame_, widht, height));
于 2013-06-12T10:06:05.520 回答
0

请执行下列操作。您的方法应该像这样接收单个对象参数void SomeVoid(object obj)。使用您想要传递给这样的方法的所有变量创建一个对象数组,SomeVoid然后object[] objArr = { arg1, arg2, arg3 };使用objArr参数调用线程对象的 Start 方法,因为 Start() 方法接收一个对象参数。现在回到你的方法,从 Start 方法接收到的 cast 和 obj 到这样的对象数组object arr = obj as object[];,然后你可以像这样访问这 3 个参数arr[0] arr[1],并且arr[2]

于 2013-06-12T10:17:14.977 回答
0

你可以使用ParameterizedThreadStart类。

1)创建一个将持有您的三个论点的类

 public class FrameProcessingArguments
 {
     public object ColorFrame { get; set; }
     public int Width { get; set; }
     public int Height { get; set; }
 }

2)修改您的Frame_Processing方法以将其实例作为参数Object并在其中将该实例强制转换为FrameProcessingArguments

if (arguments == null) throw new NullArgumentException();
if(arguments.GetType() != typeof(FrameProcessingArguments)) throw new InvalidTypeException();
FrameProcessingArguments _arguments = (FrameProcessingArguments) arguments;

3)创建并启动你的线程

FrameProcessingArguments arguments = new FrameProcessingArguments() 
{
     ColorFrame = null,
     Width = 800,
     Height = 600
}

Thread thread = new Thread (new ParameterizedThreadStart(frame_extract.Frame_Processing));
// You can also let the compiler infers the appropriate delegate creation syntax:
// and use the short form : Thread thread = new Thread(frame_extract.Frame_Processing);
thread.Start (arguments);
于 2013-06-12T10:17:16.763 回答
0

这取决于您传入的值。有时,如果您使用对象,它们会被锁定到给定线程,在这种情况下,您需要先创建重复项,然后将重复项传递到新线程中。

于 2013-06-12T10:06:03.537 回答