C ++ Многопоточность в MF C Ошибки диалога - PullRequest
2 голосов
/ 25 февраля 2020

Я попытался реализовать многопоточность, следуя примеру https://www.tutorialspoint.com/mfc/mfc_multithreading.htm в этой ссылке.

UINT CCheckDlg::MyThreadProc(LPVOID Param) {
    while (1){
        Sleep(50); // would do some work here
    }
    return TRUE;
}

это вызывается с помощью

AfxBeginThread(MyThreadProc, 0);

появляются следующие ошибки

  1. E0304 ни один экземпляр перегруженной функции "AfxBeginThread" не соответствует списку аргументов
  2. C3867 'CCheckDlg :: MyThreadPro c': нестандартный синтаксис; используйте '&', чтобы создать указатель на член

Ответы [ 3 ]

1 голос
/ 25 февраля 2020

В вашем звонке на AfxBeginThread есть две проблемы. Во-первых, как указано в комментариях, вы должны убедиться, что ваш CCheckDlg::MyThreadProc является static функцией-членом (которая должна иметь атрибут __cdecl, хотя это может по умолчанию) и используйте &CCheckDlg::MyThreadProc в качестве первого аргумента.

Другая проблема заключается в том, что 0 (второй аргумент) интерпретируется как параметр int, и поэтому компилятор не может разрешить какую из двух перегрузок выбрать. Используйте nullptr - или явный (void *)(0) - в качестве второго аргумента, чтобы была выбрана первая перегрузка.

две перегрузки для AfxBeginThread:

CWinThread* AfxBeginThread(
    AFX_THREADPROC pfnThreadProc,
    LPVOID pParam,
    int nPriority = THREAD_PRIORITY_NORMAL,
    UINT nStackSize = 0,
    DWORD dwCreateFlags = 0,
    LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);

CWinThread* AfxBeginThread(
    CRuntimeClass* pThreadClass,
    int nPriority = THREAD_PRIORITY_NORMAL,
    UINT nStackSize = 0,
    DWORD dwCreateFlags = 0,
    LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);
1 голос
/ 25 февраля 2020

Thread pro c должен быть Global функцией или Satic функцией-членом класса.

Пожалуйста, проверьте, была ли определена функция CCheckDlg::MyThreadProc stati c или нет.

В вашем коде также есть проблема.

Даже если TRUE оценивается как UINT, это проблема. Конечно, это не могло произойти ни одной ошибки. Но в общем случае все потоки возвращали 0 значений после успешного завершения, если нет, то возвращали -1. Возможно, ИСТИНА определяется как -1. Это означает, что ваша функция потока всегда будет завершена как неудачная.

0 голосов
/ 25 февраля 2020

Вот что вы должны сделать:

UINT CMFCDlg::MyThreadProc(LPVOID Param) {

    return 1;
}


UINT MyThreadProc(LPVOID pParam)
{  
    return 0;
}


BOOL CMFCDlg::CallingFunction()
{
    // First version 
    CWinThread * pThread = AfxBeginThread(MyThreadProc, 0);

    // Second version 
    pThread = AfxBeginThread(&CMFCDlg::MyThreadProc, 0);

    // third version 
    pThread = AfxBeginThread(MyThreadProc, this, THREAD_PRIORITY_IDLE, 0, CREATE_SUSPENDED);

    //fourth version
    pThread = AfxBeginThread(&CMFCDlg::MyThreadProc, this, THREAD_PRIORITY_IDLE, 0, CREATE_SUSPENDED);

    return TRUE;
}   

Зная, что функция объявлена ​​как продолжение в классе:

UINT static MyThreadProc(LPVOID Param);   

Итак, у вас есть две альтернативы: либо глобальная функция или статус c функция

...