Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Не работает AfxBeginThread, что я делаю не так?

1.9K
08 ноября 2005 года
Cranky
70 / / 05.10.2003
Перерыл кучу доков и вроде делаю все правильно но при вызове AfxBeginThread ровным счетом ничего не происходит, помогите разобратся в чем проблема.
Вот листинг моего кода

Код:
UINT BrootThread(LPVOID param);
...
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)')
9.7K
08 ноября 2005 года
DaemonDZK
59 / / 08.11.2005
Цитата:
Originally posted by Cranky
Перерыл кучу доков и вроде делаю все правильно но при вызове AfxBeginThread ровным счетом ничего не происходит, помогите разобратся в чем проблема.
Вот листинг моего кода

Код:
UINT BrootThread(LPVOID param);
...
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.

1.9K
08 ноября 2005 года
Cranky
70 / / 05.10.2003
Отлично, пишу
pBrootThread = AfxBeginThread((void)BrootProcess, GetSafeHwnd(), THREAD_PRIORITY_NORMAL, 0, 0, NULL);

Эффект все тотже. Пытаюсь запустить его ResumeThread(pBrootThread); тоже бред, ведь AfxBeginThread даже не возвращает указатель на объект процесса.
9.7K
08 ноября 2005 года
DaemonDZK
59 / / 08.11.2005
Цитата:
Originally posted by Cranky
Отлично, пишу
pBrootThread = AfxBeginThread((void)BrootProcess, GetSafeHwnd(), THREAD_PRIORITY_NORMAL, 0, 0, NULL);

Эффект все тотже. Пытаюсь запустить его ResumeThread(pBrootThread); тоже бред, ведь AfxBeginThread даже не возвращает указатель на объект процесса.



Откуда у тебя вообще BrootProcess если судя по листингу BrootThread - функция потока.

13K
08 ноября 2005 года
Offshore
7 / / 08.11.2005
Там какие-то заморочки с этим делом... Я долго мучался, пока реализовал.
Вобщем, надо ещё создать некую функцию-"обёртку", это удобно, особенно если потоком запускать метод какого-то класса.
Здесь я привел код для ф-ии потока 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; // надо сказать системе, что поток завершился удачно
}


Если что непонятно -- пишите, попытаюсь разъяснить.
1.9K
08 ноября 2005 года
Cranky
70 / / 05.10.2003
Цитата:
Originally posted by DaemonDZK
Откуда у тебя вообще BrootProcess если судя по листингу BrootThread - функция потока.



Прдон, сдебильничал когда постил листинг, везде BrootTread

9.7K
09 ноября 2005 года
DaemonDZK
59 / / 08.11.2005
Цитата:
Originally posted by Cranky
Прдон, сдебильничал когда постил листинг, везде BrootTread



...
pBrootThread = AfxBeginThread((void *)BrootThread, GetSafeHwnd(), THREAD_PRIORITY_NORMAL, 0, 0, NULL);
...
Должно работать.
Первый параметр это УКАЗАТЕЛЬ!!!
Если нет возникает несколько вопросов.
- находиться код (модуль, длл) если второе есть заморочки с сегментом данных в МФС для исправления есть макросы.
- если первое - смотри настройки проекта, может ты вообще многопотоковость не поддерживаеш.

13K
09 ноября 2005 года
Offshore
7 / / 08.11.2005
Моим способом не пашет чтоли? :)
1.9K
11 ноября 2005 года
Cranky
70 / / 05.10.2003
Цитата:
Originally posted by DaemonDZK
...
pBrootThread = AfxBeginThread((void *)BrootThread, GetSafeHwnd(), THREAD_PRIORITY_NORMAL, 0, 0, NULL);
...
Должно работать.
Первый параметр это УКАЗАТЕЛЬ!!!
Если нет возникает несколько вопросов.
- находиться код (модуль, длл) если второе есть заморочки с сегментом данных в МФС для исправления есть макросы.
- если первое - смотри настройки проекта, может ты вообще многопотоковость не поддерживаеш.



Заработало воотак:
m_hMainThread = AfxBeginThread((AFX_THREADPROC)&BrootThread, this, THREAD_PRIORITY_NORMAL);

9.7K
11 ноября 2005 года
DaemonDZK
59 / / 08.11.2005
Цитата:
Originally posted by Cranky
Заработало воотак:
m_hMainThread = AfxBeginThread((AFX_THREADPROC)&BrootThread, this, THREAD_PRIORITY_NORMAL);



Замороч MFC юзайте чистый API !!!!

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог