Время от времени WaitForSingleObject возвращает WAIT_FAILED, а GetLastError говорит про неправильный хендл. Т.е. похоже, что поток успевает завершиться до WaitForSingleObject. Так как это должно быть написано по правильному?
Здравствуйте, 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. Так как это должно быть написано по правильному?
A>>Время от времени WaitForSingleObject возвращает WAIT_FAILED, а GetLastError говорит про неправильный хендл. Т.е. похоже, что поток успевает завершиться до WaitForSingleObject. Так как это должно быть написано по правильному?
или в ф-ции LoadThread сделай в самом начале Sleep(..)
Один из самых обычных и ведущих к самым большим бедствиям соблазнов есть соблазн словами: "Все так делают".
Лев Толстой
Здравствуйте, 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. Так как это должно быть написано по правильному?
Так я не понял, тебе что мешает что у тебя поток все дела успел сделать, шустрость его мешает?
Здравствуйте, 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() неправильный хэндл? Т.е. поток вообще не создался...
Здравствуйте, Dima2, Вы писали:
D>Установить m_bAutoDelete=FALSE или пользоваться ::CreateThread
да, кстати, ведь по умолчанию m_bAutoDelete==TRUE ?
тогда если поток завершился, то объекта pThread у тебя уже нет, программа у тебя должна падать время от времени, или в релизе.
Здравствуйте, Dima2, Вы писали:
D>Здравствуйте, Dima2, Вы писали:
D>>Установить m_bAutoDelete=FALSE или пользоваться ::CreateThread
D>да, кстати, ведь по умолчанию m_bAutoDelete==TRUE ?
точно, точно
D>тогда если поток завершился, то объекта pThread у тебя уже нет, программа у тебя должна падать время от времени, или в релизе.
и в дебаге тоже должна
Один из самых обычных и ведущих к самым большим бедствиям соблазнов есть соблазн словами: "Все так делают".
Лев Толстой
Здравствуйте, Dima2, Вы писали:
D>Здравствуйте, IvEv, Вы писали:
D>>>да, кстати, ведь по умолчанию m_bAutoDelete==TRUE ? IE>>точно, точно
D>Тогда применять CWinThread* после AfxBeginThread нельзя вообще!
В данном случае нельзя...
но если поток запускать с флагом CREATE_SUSPENDED, то можно.
Один из самых обычных и ведущих к самым большим бедствиям соблазнов есть соблазн словами: "Все так делают".
Лев Толстой
Здравствуйте, IvEv, Вы писали:
IE>но если поток запускать с флагом CREATE_SUSPENDED, то можно.
да, если после AfxBeginThread установить флаг m_bAutoDelete==FALSE и не забыть прибить потом объект CWinThread*.
Здравствуйте, Dima2, Вы писали:
D>да, кстати, ведь по умолчанию m_bAutoDelete==TRUE ? D>тогда если поток завершился, то объекта pThread у тебя уже нет, программа у тебя должна падать время от времени, или в релизе.
Нет, объект остается, а вот хендл потока уже недействителен. Так что ничего не падает.
Здравствуйте, algol, Вы писали:
A>Здравствуйте, IvEv, Вы писали:
IE>>или в ф-ции LoadThread сделай в самом начале Sleep(..)
A>Не хотелось бы замедлять выполнение функции.
А запускать поток с CREATE_SUSPENDED тоже не подходит по этой же причине?
Да и еще посмотри что Вшьф2 предлагал
Здравствуйте, Dima2, Вы писали:
D>Здравствуйте, IvEv, Вы писали:
IE>>но если поток запускать с флагом CREATE_SUSPENDED, то можно. D>да, если после AfxBeginThread установить флаг m_bAutoDelete==FALSE и не забыть прибить потом объект CWinThread*.
а не надо забы(и)вать.
IMHO Если после new забываешь delete сделать, то это плохо. Так же нужно относиться и к этой ситуации.
Один из самых обычных и ведущих к самым большим бедствиям соблазнов есть соблазн словами: "Все так делают".
Лев Толстой