AfxBeginThread и WaitForSingleObject
От: algol Россия about:blank
Дата: 26.03.03 09:29
Оценка:
Имеется такой кусок кода:
    CWinThread* pThread = AfxBeginThread(LoadThread, &ld, THREAD_PRIORITY_BELOW_NORMAL);
    DWORD x = ::WaitForSingleObject(pThread->m_hThread, MAX_WAIT_TIME);

Время от времени WaitForSingleObject возвращает WAIT_FAILED, а GetLastError говорит про неправильный хендл. Т.е. похоже, что поток успевает завершиться до WaitForSingleObject. Так как это должно быть написано по правильному?
Re: AfxBeginThread и WaitForSingleObject
От: IvEv  
Дата: 26.03.03 09:39
Оценка:
Здравствуйте, algol, Вы писали:

A>Имеется такой кусок кода:

A>
A>    CWinThread* pThread = AfxBeginThread(LoadThread, &ld, THREAD_PRIORITY_BELOW_NORMAL);
A>    DWORD x = ::WaitForSingleObject(pThread->m_hThread, MAX_WAIT_TIME);
A>

A>Время от времени WaitForSingleObject возвращает WAIT_FAILED, а GetLastError говорит про неправильный хендл. Т.е. похоже, что поток успевает завершиться до WaitForSingleObject. Так как это должно быть написано по правильному?

попробуй так
    CWinThread* pThread = AfxBeginThread(LoadThread, &ld, THREAD_PRIORITY_BELOW_NORMAL, 0, CREATE_SUSPENDED);
        pThread->ResumeThread();
    DWORD x = ::WaitForSingleObject(pThread->m_hThread, MAX_WAIT_TIME);
Один из самых обычных и ведущих к самым большим бедствиям соблазнов есть соблазн словами: "Все так делают".
Лев Толстой
Re[2]: AfxBeginThread и WaitForSingleObject
От: IvEv  
Дата: 26.03.03 09:40
Оценка:
Здравствуйте, IvEv, Вы писали:

IE>Здравствуйте, algol, Вы писали:


A>>Имеется такой кусок кода:

A>>
A>>    CWinThread* pThread = AfxBeginThread(LoadThread, &ld, THREAD_PRIORITY_BELOW_NORMAL);
A>>    DWORD x = ::WaitForSingleObject(pThread->m_hThread, MAX_WAIT_TIME);
A>>

A>>Время от времени WaitForSingleObject возвращает WAIT_FAILED, а GetLastError говорит про неправильный хендл. Т.е. похоже, что поток успевает завершиться до WaitForSingleObject. Так как это должно быть написано по правильному?

или в ф-ции LoadThread сделай в самом начале Sleep(..)
Один из самых обычных и ведущих к самым большим бедствиям соблазнов есть соблазн словами: "Все так делают".
Лев Толстой
Re: AfxBeginThread и WaitForSingleObject
От: Дмитрий Наумов  
Дата: 26.03.03 09:49
Оценка:
Здравствуйте, algol, Вы писали:

A>Имеется такой кусок кода:

A>
A>    CWinThread* pThread = AfxBeginThread(LoadThread, &ld, THREAD_PRIORITY_BELOW_NORMAL);
A>    DWORD x = ::WaitForSingleObject(pThread->m_hThread, MAX_WAIT_TIME);
A>

A>Время от времени WaitForSingleObject возвращает WAIT_FAILED, а GetLastError говорит про неправильный хендл. Т.е. похоже, что поток успевает завершиться до WaitForSingleObject. Так как это должно быть написано по правильному?

Так я не понял, тебе что мешает что у тебя поток все дела успел сделать, шустрость его мешает?
... << RSDN@Home 1.0 beta 5 >>
Re: AfxBeginThread и WaitForSingleObject
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 26.03.03 10:00
Оценка:
Здравствуйте, algol, Вы писали:

A>Имеется такой кусок кода:

A>
A>    CWinThread* pThread = AfxBeginThread(LoadThread, &ld, THREAD_PRIORITY_BELOW_NORMAL);
A>    DWORD x = ::WaitForSingleObject(pThread->m_hThread, MAX_WAIT_TIME);
A>

A>Время от времени WaitForSingleObject возвращает WAIT_FAILED, а GetLastError говорит про неправильный хендл.

Может это после AfxBeginThread() неправильный хэндл? Т.е. поток вообще не создался...
... << RSDN@Home 1.0 beta 5 >>
Re[2]: AfxBeginThread и WaitForSingleObject
От: Дмитрий Наумов  
Дата: 26.03.03 10:05
Оценка:
Здравствуйте, Михаил Можаев, Вы писали:

ММ>Может это после AfxBeginThread() неправильный хэндл? Т.е. поток вообще не создался...


ММ>


Я тоже об этом сначала подумал, но думаю, что тогда бы
pThread->m_hThread


рухнуло с Access Violation (pThread == NULL)
... << RSDN@Home 1.0 beta 5 >>
Re: AfxBeginThread и WaitForSingleObject
От: Dima2  
Дата: 26.03.03 10:17
Оценка:
Здравствуйте, algol, Вы писали:

Установить m_bAutoDelete=FALSE или пользоваться ::CreateThread
Re[2]: AfxBeginThread и WaitForSingleObject
От: Dima2  
Дата: 26.03.03 10:23
Оценка:
Здравствуйте, Dima2, Вы писали:

D>Установить m_bAutoDelete=FALSE или пользоваться ::CreateThread


да, кстати, ведь по умолчанию m_bAutoDelete==TRUE ?
тогда если поток завершился, то объекта pThread у тебя уже нет, программа у тебя должна падать время от времени, или в релизе.
Re[3]: AfxBeginThread и WaitForSingleObject
От: IvEv  
Дата: 26.03.03 10:28
Оценка:
Здравствуйте, Dima2, Вы писали:

D>Здравствуйте, Dima2, Вы писали:


D>>Установить m_bAutoDelete=FALSE или пользоваться ::CreateThread


D>да, кстати, ведь по умолчанию m_bAutoDelete==TRUE ?

точно, точно

D>тогда если поток завершился, то объекта pThread у тебя уже нет, программа у тебя должна падать время от времени, или в релизе.

и в дебаге тоже должна
Один из самых обычных и ведущих к самым большим бедствиям соблазнов есть соблазн словами: "Все так делают".
Лев Толстой
Re[4]: AfxBeginThread и WaitForSingleObject
От: Dima2  
Дата: 26.03.03 10:34
Оценка:
Здравствуйте, IvEv, Вы писали:

D>>да, кстати, ведь по умолчанию m_bAutoDelete==TRUE ?

IE>точно, точно

Тогда применять CWinThread* после AfxBeginThread нельзя вообще!
Re[5]: AfxBeginThread и WaitForSingleObject
От: IvEv  
Дата: 26.03.03 10:38
Оценка:
Здравствуйте, Dima2, Вы писали:

D>Здравствуйте, IvEv, Вы писали:


D>>>да, кстати, ведь по умолчанию m_bAutoDelete==TRUE ?

IE>>точно, точно

D>Тогда применять CWinThread* после AfxBeginThread нельзя вообще!

В данном случае нельзя...
но если поток запускать с флагом CREATE_SUSPENDED, то можно.
Один из самых обычных и ведущих к самым большим бедствиям соблазнов есть соблазн словами: "Все так делают".
Лев Толстой
Re[2]: AfxBeginThread и WaitForSingleObject
От: algol Россия about:blank
Дата: 26.03.03 10:39
Оценка:
Здравствуйте, Дмитрий Наумов, Вы писали:

ДН>Так я не понял, тебе что мешает что у тебя поток все дела успел сделать, шустрость его мешает?


Меня смущает то, что WaitForSingleObject может быть вызвана с неверным хендлом. Или просто не обращать на это внимания?
Re[3]: AfxBeginThread и WaitForSingleObject
От: algol Россия about:blank
Дата: 26.03.03 10:40
Оценка:
Здравствуйте, IvEv, Вы писали:

IE>или в ф-ции LoadThread сделай в самом начале Sleep(..)


Не хотелось бы замедлять выполнение функции.
Re[6]: AfxBeginThread и WaitForSingleObject
От: Dima2  
Дата: 26.03.03 10:41
Оценка:
Здравствуйте, IvEv, Вы писали:

IE>но если поток запускать с флагом CREATE_SUSPENDED, то можно.

да, если после AfxBeginThread установить флаг m_bAutoDelete==FALSE и не забыть прибить потом объект CWinThread*.
Re[3]: AfxBeginThread и WaitForSingleObject
От: algol Россия about:blank
Дата: 26.03.03 10:43
Оценка:
Здравствуйте, Dima2, Вы писали:

D>да, кстати, ведь по умолчанию m_bAutoDelete==TRUE ?

D>тогда если поток завершился, то объекта pThread у тебя уже нет, программа у тебя должна падать время от времени, или в релизе.

Нет, объект остается, а вот хендл потока уже недействителен. Так что ничего не падает.
Re[4]: AfxBeginThread и WaitForSingleObject
От: IvEv  
Дата: 26.03.03 10:43
Оценка:
Здравствуйте, algol, Вы писали:

A>Здравствуйте, IvEv, Вы писали:


IE>>или в ф-ции LoadThread сделай в самом начале Sleep(..)


A>Не хотелось бы замедлять выполнение функции.


А запускать поток с CREATE_SUSPENDED тоже не подходит по этой же причине?
Да и еще посмотри что Вшьф2 предлагал
Автор: Dima2
Дата: 26.03.03
.
Один из самых обычных и ведущих к самым большим бедствиям соблазнов есть соблазн словами: "Все так делают".
Лев Толстой
Re[4]: AfxBeginThread и WaitForSingleObject
От: Dima2  
Дата: 26.03.03 10:44
Оценка:
Здравствуйте, algol, Вы писали:

A>Не хотелось бы замедлять выполнение функции.


делай так:

AfxBeginThread( ... CREATE_SUSPENDED ... );
pThread->m_bAutoDelete = FALSE;
WaitForSingleObject(...);
delete pThread;
Re[7]: AfxBeginThread и WaitForSingleObject
От: IvEv  
Дата: 26.03.03 10:46
Оценка:
Здравствуйте, Dima2, Вы писали:

D>Здравствуйте, IvEv, Вы писали:


IE>>но если поток запускать с флагом CREATE_SUSPENDED, то можно.

D>да, если после AfxBeginThread установить флаг m_bAutoDelete==FALSE и не забыть прибить потом объект CWinThread*.

а не надо забы(и)вать.

IMHO Если после new забываешь delete сделать, то это плохо. Так же нужно относиться и к этой ситуации.
Один из самых обычных и ведущих к самым большим бедствиям соблазнов есть соблазн словами: "Все так делают".
Лев Толстой
Re[5]: AfxBeginThread и WaitForSingleObject
От: IvEv  
Дата: 26.03.03 10:46
Оценка:
Здравствуйте, Dima2, Вы писали:

D>Здравствуйте, algol, Вы писали:


A>>Не хотелось бы замедлять выполнение функции.


D>делай так:


D>
D>AfxBeginThread( ... CREATE_SUSPENDED ... );
pThread->>m_bAutoDelete = FALSE;
D>WaitForSingleObject(...);
D>delete pThread;
D>


Именно
Один из самых обычных и ведущих к самым большим бедствиям соблазнов есть соблазн словами: "Все так делают".
Лев Толстой
Re[5]: AfxBeginThread и WaitForSingleObject
От: Dima2  
Дата: 26.03.03 10:47
Оценка: 6 (2)
Здравствуйте, Dima2, Вы писали:

забыл ResumeThread

AfxBeginThread( ... CREATE_SUSPENDED ... );
pThread->m_bAutoDelete = FALSE;
pThread->ResumeThread();
WaitForSingleObject(...);
delete pThread;
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.