Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > может кто сталкивался


Автор: nikolaich 27.3.2007, 16:54
Всем привет.
Помогите решить проблему. 
Код

................

UIINT CHaLoMoDlg::ThrProc(LPVOID param)
{
    return 0;
}

.................

void CHaLoMoDlg::OnBnClickedButton1()
{
    AfxBeginThread(ThrProc,NULL);
}


Компилятор выдает ошибку:
error C3867: 'CHaLoMoDlg::ThrProc': function call missing argument list; use '&CHaLoMoDlg::ThrProc' to create a pointer to member

Когда делаю так:
Код

void CHaLoMoDlg::OnBnClickedButton1()
{
    AfxBeginThread(&CHaLoMoDlg::ThrProc,NULL);
}


пишет:

error C2665: 'AfxBeginThread' : none of the 2 overloads could convert all the argument types

Скажу сразу, что я использую студию 2005
Заранее спасибо.

Автор: Greeen 27.3.2007, 16:58
Функция должна иметь вид
Код

UINT __cdecl MyControllingFunction( LPVOID pParam );

Она не может быть членом класса.

Точнее может, но статической. Т.е. 
Код

static UINT __cdecl CMyClass::MyControllingFunction( LPVOID pParam );

Автор: Earnest 27.3.2007, 17:07
Может, но статическим.

Автор: nikolaich 27.3.2007, 22:50
Извините вынужден был отлучиться.
Сейчас попробую. Кстати, если не ошибаюсь, даже в MSDN про то что она должна быть статической ничего нет. (правда у меня версия старая)
Киньте ссылку где можно почитать про это. (если не трудно)

Автор: Earnest 28.3.2007, 07:32
Как это нет? Вот описание AfxBeginThread из MSDN:
Цитата

Call this function to create a new thread.
CWinThread* AfxBeginThread(
   AFX_THREADPROC pfnThreadProc,
   LPVOID pParam,
   int nPriority = THREAD_PRIORITY_NORMAL,
   UINT nStackSize = 0,
   DWORD dwCreateFlags = 0,
   LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL 
);
Parameters
pfnThreadProc 
Points to the controlling function for the worker thread. Cannot be NULL. This function must be declared as follows: 
UINT MyControllingFunction( LPVOID pParam );

Видим семантику функции: глобальная функция с одним параметром. Что еще должно быть написано, чтобы было понятно, что методы класса не годятся?

Автор: nikolaich 28.3.2007, 21:58
Ну лох я, согласен, но где здесь про static?.

Автор: Earnest 29.3.2007, 08:10
Нигде про класс ничего нет. Ты сам должен знать, что в качестве глобальной функции может выступать статический метод класса.

Добавлено через 3 минуты и 5 секунд
А нестатический - не может, так как у него есть еще один неявный параметр - this. Следовательно, сигнатура не подходит.

Автор: nikolaich 30.3.2007, 19:58
Спасибо Earnest. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)