Рабочая нить в МФЦ - PullRequest
       2

Рабочая нить в МФЦ

0 голосов
/ 24 января 2011

Я хочу создать простой рабочий поток внутри одного класса. Однако есть 3 основных проблемы, с которыми я сталкиваюсь:

  1. Определение функции потока в заголовке класса.
  2. Функция потока вызов .
  3. Функция вызванного потока формат .

Мне также непонятно использовать вызов функции AfxBeginThread или CreateThread для передачи нескольких параметров потока. Может ли кто-нибудь предоставить мне простой рабочий поток для запуска в MFC на основе 3 вещей, которые я предоставил выше?

Ответы [ 3 ]

1 голос
/ 24 января 2011

Определение функции потока в заголовке класса: это должен быть статический член, потому что обычный способ поместить this в скрытый параметр не работает.Поскольку вы получаете только один параметр, вы хотите, чтобы этот параметр был указателем на структуру, и один член структуры может быть «this» экземпляра класса, который может вызывать ваш статический член.

Вызов функции потока: Поскольку вызываемая функция будет использовать MFC, проще всего вызвать вызывающую функцию AfxBeginThread.Поскольку вы говорите, что поток будет рабочим потоком, вызовите версию AfxBeginThread, которая предназначена для рабочих потоков (даже если это не имеет большого значения).

Формат функции вызванного потока.MSDN описывает AfxBeginThread и говорит, какой прототип должен использоваться для первого параметра.

0 голосов
/ 29 февраля 2016

CreateThread в основном для потоков пользовательского интерфейса, но все же предпочтительнее использовать второй метод для AfxBeginThread. Храните ссылку на дескриптор потока в заголовке, а не в потоке.

HANDLE hThread;

затем в исходном тексте запустите вашу ветку, указывающую на ваш процесс:

CWinThread *pThread;
if(!(pThread = AfxBeginThread(ThreadProc, NULL, THREAD_PRIORITY_NORMAL, 0,     CREATE_SUSPENDED))) {
delete arr;
} 
::DuplicateHandle(GetCurrentProcess(), pThread->m_hThread, GetCurrentProcess(), &hThread, 0, FALSE, DUPLICATE_SAME_ACCESS);

pThread->ResumeThread();

Вы запускаете его приостановленным, чтобы вы могли скопировать дескриптор в тот, который вы сохранили в заголовке. таким образом, вы можете использовать сохраненный дескриптор для проверки кода выхода.

0 голосов
/ 27 января 2011

В идеале, вы никогда не должны использовать CreateThred.И если вы используете MFC, вы ДОЛЖНЫ использовать AfxBeginThread для создания потоков.

Я дал здесь некоторые пояснения в этом обсуждении:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...