int a =0;
UINT Thr(LPVOID Param)
{
for(;;){
if(a=1) break;
***}
return 0;
}
Как прибить поток AfxBeginThread?
варианта два:
UINT Thr(LPVOID Param)
{
***
return 0;
}
и
UINT Thr(LPVOID Param)
{
While(1){***}
return 0;
}
правильно ли я понимаю (msdn так учит), что в первом случае (не зациклено ничего внутри потока) нужно перед return написать AfxEndThread(0,1); ?
можно ли во втором варианте
использовать:
(CWinThread * hThrOnCapture)
DWORD ExitCode; GetExitCodeThread(hThrOnCapture->m_hThread,&ExitCode);
if( ExitCode == STILL_ACTIVE )
{ TerminateThread(hThrOnCapture->m_hThread,ExitCode);
}
как понять, что потоки мои правильно прибились (в hThrOnCapture что-то занулиться должно или ....?)?
ошибка:
Runtime Error!
This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information
м.б. связана с неправильным прибиванием потоков?
Код:
а писать AfxEndThread(0,1); вообще вроде не надо
Код:
.......
HANDLE hClose;
.......
void main(...)
{
//Создаём событие, с автосбросом
hClose = CreateEvent(NULL,FALSE,FALSE,NULL);
........
//И когда нужно завершить поток, генерируем событие
SetEvent(hClose);
........
//Закрываем событие
CloseHandle(hClose);
}
UINT Thr(LPVOID Param)
{
while(1){
//Ожидаем 10 миллисекунд, события на завершение потока,
//если его нет, то продолжаем работу.
if(WaitForSingleObject(hClose,10) == WAIT_OBJECT_0)
return 0; //Завершаем работу потока
//Что-то делаем
}
}
HANDLE hClose;
.......
void main(...)
{
//Создаём событие, с автосбросом
hClose = CreateEvent(NULL,FALSE,FALSE,NULL);
........
//И когда нужно завершить поток, генерируем событие
SetEvent(hClose);
........
//Закрываем событие
CloseHandle(hClose);
}
UINT Thr(LPVOID Param)
{
while(1){
//Ожидаем 10 миллисекунд, события на завершение потока,
//если его нет, то продолжаем работу.
if(WaitForSingleObject(hClose,10) == WAIT_OBJECT_0)
return 0; //Завершаем работу потока
//Что-то делаем
}
}
Да, вот ещё что, в предыдущем посте, для того чтобы работать с переменной из разных потоков нужно использовать критические секции, иначе одновременный доступ из разных потоков к этой переменной может привести к краху программы. Делается это примерно так:
Код:
........
CRITICAL_SECTION cSection;
........
int a =0;
void main(...)
{
//Инициализация критической секции
InitializeCriticalSection(&cSection);
........
EnterCriticalSection(&cSection);
a = 1; //Завершаем поток
LeaveCriticalSection(&cSection );
........
//Удаляем критическую секцию
DeleteCriticalSection(&cSection);
}
UINT Thr(LPVOID Param)
{
for(;;){
long lExit = 0;
EnterCriticalSection(&cSection);
lExit = a;
LeaveCriticalSection(&cSection);
if(a == 1)
break;
}
return 0;
}
CRITICAL_SECTION cSection;
........
int a =0;
void main(...)
{
//Инициализация критической секции
InitializeCriticalSection(&cSection);
........
EnterCriticalSection(&cSection);
a = 1; //Завершаем поток
LeaveCriticalSection(&cSection );
........
//Удаляем критическую секцию
DeleteCriticalSection(&cSection);
}
UINT Thr(LPVOID Param)
{
for(;;){
long lExit = 0;
EnterCriticalSection(&cSection);
lExit = a;
LeaveCriticalSection(&cSection);
if(a == 1)
break;
}
return 0;
}