Как отправить thread :: id в PostThreadMessageA? - PullRequest
2 голосов
/ 11 марта 2020

У меня есть std::thread объект, и я хочу отправить идентификатор потока, который std::thread::id к PostThreadMessageA , который получает DWORD a typedef unsigned long. Как я могу отправить идентификатор потока?

1 Ответ

2 голосов
/ 11 марта 2020

Как правило, вы можете вызвать функцию std::thread::native_handle, чтобы получить определяемый реализацией собственный тип дескриптора, и std::thread::get_id, чтобы получить идентификатор потока.

Поскольку для упомянутой вами функции PostThreadMessage требуется идентификатор потока, а не «дескриптор», на первый взгляд представляется целесообразным использовать функцию std::thread::get_id вместо std::thread::native_handle. Однако, согласно официальной документации Microsoft для функции std::thread::get_id, функция возвращает объект типа class thread::id, а не DWORD, но для функции PostThreadMessage требуется DWORD для идентификатор потока. официальная документация Microsoft по class thread::id не предоставляет никакого документированного способа преобразования этого класса в DWORD.

Хотя может быть возможно преобразовать class thread::id в DWORD путем какого-то недокументированного взлома, я рекомендую вместо этого использовать следующий документированный подход:

В соответствии с официальной документацией Microsoft по функции std::thread::native_handle, функция возвращает нативный Win32 HANDLE. Это означает, что вы можете передать это HANDLE собственным функциям Win32 API. Следовательно, вы можете передать такую ​​HANDLE в функцию Win32 API GetThreadId, которая возвращает идентификатор потока как DWORD. Это возвращенное значение затем может быть передано в функцию PostThreadMessage.

Итак, чтобы извлечь идентификатор потока как DWORD из объекта типа std::thread, вы можете использовать следующую строку кода:

DWORD dwThreadId = GetThreadId( my_thread_object.native_handle() );

Обратите внимание, что функция PostThreadMessage требует, чтобы целевой поток создал очередь сообщений, в противном случае вызов функции не будет выполнен. Если поток был создан с помощью std::thread API, возможно, такая очередь сообщений не была создана. Поэтому вы должны убедиться, что целевой поток вызывает функцию GetMessage или PeekMessage хотя бы один раз, прежде чем отправлять этому потоку сообщение, используя PostThreadMessage. Для получения дополнительной информации см. официальную документацию Microsoft по этой функции .

...