2016-08-23 3 views
-1

Хорошо, поэтому давайте скажем, что у меня есть ссылка на System.Threading.Thread, называемый потоком A, и я нахожусь в другом потоке, скажем, поток B. Теперь мне нужно немного выполнить код в потоке A, а затем вернуться обратно. Используя ссылку, которую я имею, как я могу вызвать поток A, чтобы сделать в нем действие?System.Threading.Thread - выполнить операцию на нем

Ну, я делаю библиотеку C++/cli. Один из моих объектов имеет сходство потоков. Я ввожу метод, мне нужно поменять потоки, как в Диспетчере.Invoke.

void AllegroSharp::Display::DrawToBackBuffer(BitmapImage^ image) 
{ 
    al_draw_bitmap(image->GetBitmap(), (float)image->Rect->Position->X, (float)image->Rect->Position->Y, 0); 
} 

DrawToBackBuffer вызывается на нити В и al_draw_bitmap должен быть вызван на тему А, что у меня есть ссылка на. Как я могу это сделать в потоке A? Thread B - это просто поток, который C# породил, когда я сделал Task.Run в управляемом коде.

+0

Это Winforms, WPF или что-то еще? –

+1

Выполнение произвольного кода на * конкретном * потоке вообще не возможно. Если нить не взаимодействует, она должна решить проблему [производитель-потребитель] (https://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem). Занимает поточную цепочку и цикл в потоке, который освобождает его. Любой поток может добавлять элементы в очередь, например, объект делегата. Пользовательский интерфейс GUI-программы всегда решает его, принимает Control :: Begin/Invoke() или Dispatcher :: Begin/Invoke(), возможно, о чем вы действительно спрашиваете. –

+0

Будет ли шаблон дизайна Blackboard делать то, что вы хотите? https://en.wikipedia.org/wiki/Blackboard_(design_pattern) – EJoshuaS

ответ

1

Нитки запускают один набор инструкций от начала до конца. Если поток A уже запущен, он будет выполнять любой код, который, как было сказано, запускается от начала до конца. Вы не сможете изменить то, что оно работает, если оно не активно контролирует некоторую общую память для инструкций о том, что делать дальше. Обычно способ реализации этого заключается в том, что поток выполняется в цикле, и внутри этого цикла проверяет очередь сообщений. Затем, чтобы другие потоки добавляли сообщения в эту очередь, чтобы дать работу цикла. Есть намного больше деталей, чтобы заставить его работать правильно, но это основная идея.

Если в вашем конкретном случае, поток А GUI поток приложения, это механизм передачи сообщений уже созданы для вас, и вы можете использовать Control.Invoke (WinForms) или Dispatcher.Invoke (WPF), чтобы передать единицу работы поток графического интерфейса пользователя и дождитесь его завершения.

Редактировать: этот ответ был менее применим путем добавления новой информации к вопросу. Ах хорошо.

Смежные вопросы