Не работает AfxBeginThread, что я делаю не так?
Вот листинг моего кода
...
void CBrootDlg::OnBnClickedStartButton()
{
CWinThread* pBrootThread = 0;
pBrootThread = AfxBeginThread((void)BrootProcess, GetSafeHwnd(), THREAD_PRIORITY_NORMAL);
if(pBrootThread == 0)
{
AfxMessageBox("Cann't create thread!");
}
}
...
UINT BrootThread(LPVOID param)
{
::MessageBox((HWND)param, "Thread activated","Message from Thread" ,MB_OK);
return 0;
}
Кстати и еще одна непонятная для меня странность, если создавать поток AfxBeginThread(BrootProces, ...), то начинает ругатся ('AfxBeginThread' : none of the 2 overloads can convert parameter 1 from type 'int (void)')
Перерыл кучу доков и вроде делаю все правильно но при вызове AfxBeginThread ровным счетом ничего не происходит, помогите разобратся в чем проблема.
Вот листинг моего кода
...
void CBrootDlg::OnBnClickedStartButton()
{
CWinThread* pBrootThread = 0;
pBrootThread = AfxBeginThread((void)BrootProcess, GetSafeHwnd(), THREAD_PRIORITY_NORMAL);
if(pBrootThread == 0)
{
AfxMessageBox("Cann't create thread!");
}
}
...
UINT BrootThread(LPVOID param)
{
::MessageBox((HWND)param, "Thread activated","Message from Thread" ,MB_OK);
return 0;
}
Кстати и еще одна непонятная для меня странность, если создавать поток AfxBeginThread(BrootProces, ...), то начинает ругатся ('AfxBeginThread' : none of the 2 overloads can convert parameter 1 from type 'int (void)')
MSDN:
AfxBeginThread
....
dwCreateFlags
Specifies an additional flag that controls the creation of the thread. This flag can contain one of two values:
- CREATE_SUSPENDED Start the thread with a suspend count of one. Use CREATE_SUSPENDED if you want to initialize any member data of the CWinThread object, such as m_bAutoDelete or any members of your derived class, before the thread starts running. Once your initialization is complete, use the CWinThread::ResumeThread to start the thread running. The thread will not execute until CWinThread::ResumeThread is called.
- 0 Start the thread immediately after creation.
pBrootThread = AfxBeginThread((void)BrootProcess, GetSafeHwnd(), THREAD_PRIORITY_NORMAL, 0, 0, NULL);
Эффект все тотже. Пытаюсь запустить его ResumeThread(pBrootThread); тоже бред, ведь AfxBeginThread даже не возвращает указатель на объект процесса.
Отлично, пишу
pBrootThread = AfxBeginThread((void)BrootProcess, GetSafeHwnd(), THREAD_PRIORITY_NORMAL, 0, 0, NULL);
Эффект все тотже. Пытаюсь запустить его ResumeThread(pBrootThread); тоже бред, ведь AfxBeginThread даже не возвращает указатель на объект процесса.
Откуда у тебя вообще BrootProcess если судя по листингу BrootThread - функция потока.
Вобщем, надо ещё создать некую функцию-"обёртку", это удобно, особенно если потоком запускать метод какого-то класса.
Здесь я привел код для ф-ии потока UINT SomeThread(VOID), а не LPVOID param, прошу заметить. Ну это легко чинится, если надо:
template<class T, UINT(T::*mem_fun)(void)> inline UINT thread_to_member_thunk(void* p)
{
return (static_cast<T*>(p)->*mem_fun)();
}
// Ф-я, в которой создаём поток
VOID CSomeClass::SomeFunc(VOID)
{
...
pSomeThread = AfxBeginThread(thread_to_member_thunk<CSomeClass, SomeThread>, this);
// this -- указатель на класс, чей метод мы вызываем потоком
...
}
UINT CSomeClass::SomeThread()
{
...
...
...
return 0; // надо сказать системе, что поток завершился удачно
}
Если что непонятно -- пишите, попытаюсь разъяснить.
Откуда у тебя вообще BrootProcess если судя по листингу BrootThread - функция потока.
Прдон, сдебильничал когда постил листинг, везде BrootTread
Прдон, сдебильничал когда постил листинг, везде BrootTread
...
pBrootThread = AfxBeginThread((void *)BrootThread, GetSafeHwnd(), THREAD_PRIORITY_NORMAL, 0, 0, NULL);
...
Должно работать.
Первый параметр это УКАЗАТЕЛЬ!!!
Если нет возникает несколько вопросов.
- находиться код (модуль, длл) если второе есть заморочки с сегментом данных в МФС для исправления есть макросы.
- если первое - смотри настройки проекта, может ты вообще многопотоковость не поддерживаеш.
...
pBrootThread = AfxBeginThread((void *)BrootThread, GetSafeHwnd(), THREAD_PRIORITY_NORMAL, 0, 0, NULL);
...
Должно работать.
Первый параметр это УКАЗАТЕЛЬ!!!
Если нет возникает несколько вопросов.
- находиться код (модуль, длл) если второе есть заморочки с сегментом данных в МФС для исправления есть макросы.
- если первое - смотри настройки проекта, может ты вообще многопотоковость не поддерживаеш.
Заработало воотак:
m_hMainThread = AfxBeginThread((AFX_THREADPROC)&BrootThread, this, THREAD_PRIORITY_NORMAL);
Заработало воотак:
m_hMainThread = AfxBeginThread((AFX_THREADPROC)&BrootThread, this, THREAD_PRIORITY_NORMAL);
Замороч MFC юзайте чистый API !!!!