Есть поток — создаваемый AfxBeginThread() (рабочий поток)
Внутри его функции идет вывов функции void Func(x), которая работает с памятью
(в начале выделяет ее себе, а потом освобождает).
Все это повторяется несколько циклов после чего поток завершается и класс самоуничтожается.
Если же завершить приложение во время работы потока — получаем memory leak.
Вопрос — как завершается поток при завершении приложения (каким способом)?
Как отследать в потоке завершение приложения (что бы сначало высвободить ресурсы).
(хм... как я понимаю он прерывается в любом месте.)
И как определить — является ли ссылка указателем на существующий класс потока
или он уже к даннному времени уничтожен.
Здравствуйте, Doc, Вы писали:
Doc>Есть поток — создаваемый AfxBeginThread() (рабочий поток) Doc>Внутри его функции идет вывов функции void Func(x), которая работает с памятью Doc>(в начале выделяет ее себе, а потом освобождает). Doc>Все это повторяется несколько циклов после чего поток завершается и класс самоуничтожается.
Doc>Если же завершить приложение во время работы потока — получаем memory leak. Doc>Вопрос — как завершается поток при завершении приложения (каким способом)? Doc>Как отследать в потоке завершение приложения (что бы сначало высвободить ресурсы). Doc>(хм... как я понимаю он прерывается в любом месте.)
Doc>И как определить — является ли ссылка указателем на существующий класс потока Doc>или он уже к даннному времени уничтожен.
Есть замечательная функция
DWORD WaitForSingleObject(
HANDLE hHandle, // handle to object to wait for
DWORD dwMilliseconds // time-out interval in milliseconds
);
Она ждет какого-нибудь объекта.
В твоем случае при завершении программы следует проверять работает ли еще поток и, если работает, вызвать эту функцию, которая будет ждать пока поток не завершит работу.
Пример
// предположим, что где-то было написано CWinThread *m_Thread = ::AfxBeginThread(.....)
// m_Thread необходимо хранить
// здесь можно установить какой-нибудь глобальный флаг, кот. сообщит потоку, что пора бы и остановиться (а в потоке
//проверять состояние этого флага).
if (::WaitForSingleObject(m_Thread->m_hThread, INFINITE) == WAIT_FAILED) // ждем пока остановится
{
// если ошибка, то идем сюда.
DWORD exCode;
if (::GetExitCodeThread(m_Thread->m_hThread, &exCode))
{
if (exCode != 1)
}
}
}
}
// m_Thread явно уничтожать не надо.
А ссылку наверное можно проверить с помощью проверки значения m_Thread->m_hThread или самого m_Thread
Здравствуйте, Doc, Вы писали:
Doc>Есть поток — создаваемый AfxBeginThread() (рабочий поток) Doc>Внутри его функции идет вывов функции void Func(x), которая работает с памятью Doc>(в начале выделяет ее себе, а потом освобождает).
Может использовать классы-обёртки (в конструкторе выделить(например),в деструкторе освободить).
Или ExitInstance, OnFinalRelease переопределить
Re[2]: Завершение потока при завершении приложения
DS>Есть замечательная функция DS>DWORD WaitForSingleObject();
Пробовал.
Получилось следующее:
замечу сначала, что функция, которая работает с памятью и вызывается внутри thread в своем начале делает LoadLibrary а в конце FreeLibrary.
Так вот, без нее получаем как я говорил mem leak, по output window видно что DLL загружается и все... выход и утечка.
С WaitForSingleObject() получаю что DLL выгружается (функция завершилась), и все... висит приложение... Отладчик говорит что стоим на WaitForSingleObject(), точки останова внутри функции потока стоят спокойно. Поток похоже стоит. ;(
DS>А ссылку наверное можно проверить с помощью проверки значения m_Thread->m_hThread или самого m_Thread
непонял. В смысле проверять на != NULL? Дык это после иницилизации и до первого вызова — после там что-угодно будет.
Re[2]: Завершение потока при завершении приложения
Здравствуйте, KGP, Вы писали: KGP>Может использовать классы-обёртки (в конструкторе выделить(например),в деструкторе освободить). KGP>Или ExitInstance, OnFinalRelease переопределить
Вся работа с памятью идет в вызываемой функции. Т.е. потоко прирывается "в любой момент",
то получается утечка.
Можно конечно функциональность вызываемой функции перенести в функцию потока но хочется меньшей кровью обойтись.