Вызов std :: thread с оператором класса () (), который имеет CWinThread в качестве базового сбоя - PullRequest
0 голосов
/ 10 ноября 2019

Фон:

Мой проект C++ MFC. Но я пишу код, используя современный C ++ по мере развития стандарта. В настоящее время я вызываю потоки, иногда используя std::thread (более поздний код), а иногда MFC CreateThread с обязательным waitForSingleObject и параметром приоритета потока. Ясно, что std::thread более элегантен и, следовательно, более удобен в обслуживании. Важно со временем привести код в соответствие и отбросить старые идиомы, где это возможно.

Проблема:

Но при вызове std::thread с классом Baz в образцеприведенный ниже код, в качестве основы которого указан CWinThread, не может найти конструктор std::thread .

Пример кода:

struct Caz {};
struct Baz : public CWinThread // works if base is Caz
{
  void operator()() {}
};

std::shared_ptr< Baz > b;
b = std::make_shared< Baz >();

std::thread bazThread( *b ); // error: can't find a constructor when CWinThread is base, but can for Caz as base

Когда базовый класс равен CWinThread, он не может разрешиться, но когда базовый класс равен Caz, он работает нормально. И Caz, и CWinThread имеют конструкторы по умолчанию.

Почему CWinThread вызывает сбой?

Edit1:

Сообщение об ошибкеустанавливается:

1> C: \ Program Files (x86) \ Microsoft Visual Studio \ 2019 \ Community \ VC \ Tools \ MSVC \ 14.23.28105 \ include \ memory (2057,35):ошибка C2665: 'std :: tuple :: tuple': ни одна из двух перегрузок не может преобразовать все типы аргументов

1> C: \ Program Files (x86) \ Microsoft Visual Studio \ 2019 \ Community \ VC\ Tools \ MSVC \ 14.23.28105 \ include \ tuple (321,5): message: может быть 'std :: tuple :: tuple (std :: tuple &&)'

1> C: \ ProgramФайлы (x86) \ Microsoft Visual Studio \ 2019 \ Community \ VC \ Tools \ MSVC \ 14.23.28105 \ include \ tuple (320,5): message: или 'std :: tuple :: tuple (const std :: tuple &) '

1> C: \ Program Files (x86) \ Microsoft Visual Studio \ 2019 \ Community \ VC \ Tools \ MSVC \ 14.23.28105 \ include \ memory (2056,59): сообщение: при попыткесопоставить список аргументов '(_Ty2)'

1> C: \ Program Files (x86) \ Microsoft Visual Studio \ 2019 \ Community \ VC \ Tools \ MSVC \ 14.23.28105 \ include \ memory (2056,59): сообщение: с

1> C: \ Program Files (x86) \ Microsoft Visual Studio \ 2019 \ Community \ VC\ Tools \ MSVC \ 14.23.28105 \ include \ memory (2056,59): сообщение: [

1> C: \ Program Files (x86) \ Microsoft Visual Studio \ 2019 \ Community \ VC \ Tools \MSVC \ 14.23.28105 \ include \ memory (2056,59): сообщение: _Ty2 = Baz 1> C: \ Program Files (x86) \ Microsoft Visual Studio \ 2019 \ Community \ VC \ Tools \ MSVC \ 14.23.28105 \ include\ memory (2056,59): сообщение:]

1> C: \ Program Files (x86) \ Microsoft Visual Studio \ 2019 \ Community \ VC \ Tools \ MSVC \ 14.23.28105 \ include \ thread (53): сообщение: см. Ссылку на создание экземпляра шаблона функции 'std :: unique_ptr <_Tuple, std :: default_delete <_Ty >> std :: make_unique <_Tuple, _Ty2 &, 0> (_ Ty2 &)', который компилируется

1> C: \ Program Files (x86) \ Microsoft Visual Studio \ 2019 \ Community \ VC \ Tools \ MSVC \ 14.23.28105 \ include \ thread (53): сообщение: с

1> C:\ Program Files (x86) \ Microsoft Visual Studio \ 2019 \ Community \ VC \ Tools \ MSVC \14.23.28105 \ include \ thread (53): сообщение: [

1> C: \ Program Files (x86) \ Microsoft Visual Studio \ 2019 \ Community \ VC \ Tools \ MSVC \ 14.23.28105 \ include\ thread (53): сообщение: _Ty = _Tuple,

1> C: \ Program Files (x86) \ Microsoft Visual Studio \ 2019 \ Community \ VC \ Tools \ MSVC \ 14.23.28105 \ include \ thread(53): сообщение: _Ty2 = Baz

1> C: \ Program Files (x86) \ Microsoft Visual Studio \ 2019 \ Community \ VC \ Tools \ MSVC \ 14.23.28105 \ include \ thread (53): message:]

1> E: \ Hiveware \ trunk \ Windows \ hives \ Hiveware \ SdcdcHiveware \ GrammarSdcdcHiveware.cpp (153): message: см. ссылку на создание шаблона функции 'std :: thread :: thread<_Ty2 & ,, void> (_ Fn) 'компилируется

1> E: \ Hiveware \ trunk \ Windows \ hives \ Hiveware \ SdcdcHiveware \ GrammarSdcdcHiveware.cpp (153): сообщение: с

1> E: \ Hiveware \ trunk \ Windows \ hives \ Hiveware \ SdcdcHiveware \ GrammarSdcdcHiveware.cpp (153): сообщение: [

1> E: \ Hiveware \ trunk \ Windows \ hives \ Hiveware \ SdcdcHiveware \ GrammarSdcdcHiveware.cpp (153): сообщение: _Ty2 = Baz,

1> E: \ Hiveware \ trunk \ Windows \hives \ Hiveware \ SdcdcHiveware \ GrammarSdcdcHiveware.cpp (153): сообщение: _Fn = Baz &

1> E: \ Hiveware \ trunk \ Windows \ hives \ Hiveware \ SdcdcHiveware \ GrammarSdcdcHiveware.cpp 15) (сообщение):]

1> Готовый проект здания "SdcdcHiveware.vcxproj" - СБОЙ.

Редактировать 2:

// FUNCTION TEMPLATE make_unique
template <class _Ty, class... _Types, enable_if_t<!is_array_v<_Ty>, int> = 0>
_NODISCARD unique_ptr<_Ty> make_unique(_Types&&... _Args) { // make a unique_ptr
    return unique_ptr<_Ty>(new _Ty(_STD forward<_Types>(_Args)...));
}

1 Ответ

0 голосов
/ 11 ноября 2019

Предварительный ответ, если кто-то не найдет обходного пути.

std::thread нельзя использовать в MFC проектах для типов классов, которые наследуются от CWinThread, также называемых user threads, для которых можно найти пример кодаat Создание потоков .

Для традиционных окон worker threads вместо этого нормально работает std :: thread.

...