Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как прибить поток AfxBeginThread?

378
08 мая 2007 года
KurL
171 / / 01.08.2005
Научите, как правильно прибить поток, запущенный при помощи 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

м.б. связана с неправильным прибиванием потоков?
4.5K
08 мая 2007 года
e-XperT
127 / / 04.07.2006
Прибивание потоков с помощью TerminateThread вообще не рекомендуется не проще ли сделать глобальную переменную и провести выход из цикла
 
Код:
int a =0;
UINT Thr(LPVOID Param)
{
for(;;){
if(a=1) break;
***}
return 0;
}

а писать AfxEndThread(0,1); вообще вроде не надо
2.2K
10 мая 2007 года
REFOT
181 / / 08.04.2005
Например с помощью событий:

Код:
.......
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;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог