Задача 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 в основной теме.

Другие вопросы по тегам