Задача PPL - продолжение в потоке пользовательского интерфейса для настольного приложения
Я хотел бы использовать задачу ppl, чтобы сделать некоторую работу в фоновом режиме, и, после завершения, показать результат в окне. В моем случае UI-framework это MFC. Структура будет:
using namespace concurrency;
create_task([] {
// this can be run in any thread, shouldn't be the UI thread
// do real work here
return 42;
}).then([](int n)
{
// this should be run on the UI thread
// ... open a MFC window to display results
});
Дело в том, что приложение, отличное от Магазина Windows, не позволяет указывать task_continuation_context. Вместо этого среда выполнения решает, какой контекст будет использоваться (см. Класс task_continuation_context). Могу ли я рассчитывать на время выполнения, чтобы надежно выяснить, что ему нужно для запуска продолжения в потоке пользовательского интерфейса? Есть ли разумный обходной путь для достижения того, чего я хочу - без блокировки потока пользовательского интерфейса?
Обновление: Игра показала, что среда выполнения не будет запускать продолжение в потоке пользовательского интерфейса. Итак, это невозможно?
1 ответ
Чтобы решить эту проблему, я создал класс Dispatcher и окно только для сообщений, которое является членом Dispatcher. Диспетчер должен быть построен (я использовал синглтон) из основного потока так, чтобы основной поток заботился о сообщениях, которые отправляются в окно только для сообщений. Я могу передать std::function
к моему Dispatcher::ExecuteInMainThread
функция. Диспетчер затем вызовет SendMessage
в окне только для сообщений, передавая указатель (к сожалению, будет возможен только указатель) к std::function
, Единственный обработчик сообщений, который мне нужен в окне только для сообщений, затем вызовет функцию, которую я передал, - в основном потоке.
Этот Диспетчер может использоваться в продолжении задачи для выполнения std::function
в основной теме.