Завершение потока при завершении приложения
От: Doc Россия http://andrey.moveax.ru
Дата: 25.07.03 06:50
Оценка:
Есть поток — создаваемый AfxBeginThread() (рабочий поток)
Внутри его функции идет вывов функции void Func(x), которая работает с памятью
(в начале выделяет ее себе, а потом освобождает).
Все это повторяется несколько циклов после чего поток завершается и класс самоуничтожается.

Если же завершить приложение во время работы потока — получаем memory leak.
Вопрос — как завершается поток при завершении приложения (каким способом)?
Как отследать в потоке завершение приложения (что бы сначало высвободить ресурсы).
(хм... как я понимаю он прерывается в любом месте.)

И как определить — является ли ссылка указателем на существующий класс потока
или он уже к даннному времени уничтожен.
Re: Завершение потока при завершении приложения
От: Don Sergio  
Дата: 25.07.03 07:09
Оценка:
Здравствуйте, 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


Вот.
Re: Завершение потока при завершении приложения
От: KGP http://kornilow.newmail.ru
Дата: 25.07.03 08:11
Оценка:
Здравствуйте, Doc, Вы писали:

Doc>Есть поток — создаваемый AfxBeginThread() (рабочий поток)

Doc>Внутри его функции идет вывов функции void Func(x), которая работает с памятью
Doc>(в начале выделяет ее себе, а потом освобождает).
Может использовать классы-обёртки (в конструкторе выделить(например),в деструкторе освободить).
Или ExitInstance, OnFinalRelease переопределить
Re[2]: Завершение потока при завершении приложения
От: Doc Россия http://andrey.moveax.ru
Дата: 25.07.03 09:17
Оценка:
Здравствуйте, Don Sergio, Вы писали:


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]: Завершение потока при завершении приложения
От: Doc Россия http://andrey.moveax.ru
Дата: 25.07.03 09:19
Оценка:
Здравствуйте, KGP, Вы писали:
KGP>Может использовать классы-обёртки (в конструкторе выделить(например),в деструкторе освободить).
KGP>Или ExitInstance, OnFinalRelease переопределить
Вся работа с памятью идет в вызываемой функции. Т.е. потоко прирывается "в любой момент",
то получается утечка.
Можно конечно функциональность вызываемой функции перенести в функцию потока но хочется меньшей кровью обойтись.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.