2013-06-12 3 views
0

Я пишу код в C# для обработки изображений. Я хочу использовать потоки, и я полагаю, что потоки в приложении WPF мало чем отличаются. Я попытался запустить поток, но он работает только тогда, когда функция void(), т. Е. Не принимает никаких аргументов.WPF C# Threading

Однако моя функция принимает 3 пылкая как этот

frame_extract.Frame_Processing(_colorFrame_, widht, height); 

И поэтому следующие не работает

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

возможно я что-то не хватает, но мой вопрос, как я могу работать с threading для функций, которые принимают аргументы.

ответ

2

Возможно, вы можете использовать TPL.

Затем он должен быть что-то вроде:

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

Но знайте, что вы, возможно, придется мобилизовывать в UI-потоке.

Если вы хотите, чтобы создать поток в потоке пользовательского интерфейса и хотите новый поток, чтобы взаимодействовать с указанной Ui нитью, что-то вроде должно работать:

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

Это должно работать.

+0

работает отлично, но я вижу, что вы сказали маршалу ui-thread. Можете ли вы объяснить, что это значит. Извините, так как я новичок в этом, я все еще участвую. –

0

Это зависит от того, какие значения вы передаете. Иногда, если вы используете объекты, они блокируются для данного потока, и в этом случае вам необходимо создать дубликаты ранее, а затем передать дубликаты в новый поток.

1

Я не 100% уверен, что это то, что вы хотите, но я думаю, что вам нужно сделать, это:

depth_Threads = new System.Threading.Thread(()=>frame_extract.Frame_Processing(_colorFrame_, widht, height)); 
0

Выполните следующие действия. Ваш метод должен получать один аргумент объекта, такой как void SomeVoid(object obj). Создайте массив объектов со всеми переменными, которые вы хотите передать методу SomeVoid следующим образом: object[] objArr = { arg1, arg2, arg3 };, а затем вызовите метод «Пуск» объекта потока с аргументом objArr, так как метод Start() получает один параметр объекта. Теперь вернусь к вашему методу, гипсу и OBJ, полученные от метода запуска на массив объектов, как этот object arr = obj as object[];, а затем вы можете получить доступ к этим 3-х аргументам, как этот arr[0] arr[1] и arr[2]

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);