Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2012, 10:27   #1
GeorgeBatyuchenko
Новичок
Джуниор
 
Регистрация: 18.12.2012
Сообщений: 2
По умолчанию Проблема с выходом из потока

Доброго времени суток!
Работаю в VS2010 C++ Express, имею проблему с завершением потока. Примечательно, что в методе, выполняющимся в новом потоке заведен бесконечный цикл. Насколько я понимаю для объекта типа System::Threading::Thread выполняются следующие правила:
1) Нельзя закончить поток в состоянии WaitSleepJoin, будет ThreadAbortExeption;
2) Из состояния WaitSleepJoin можно выйти вызвав метод Interrupt();
3) Если поток находится в состоянии WaitSleepJoin, то вызов Suspend ни к чему не приведет;
Header:
Код:
#pragma once
using namespace System::Threading;
#define  THREAD_TIMEOUT 200
ref class CamThread
{
public:
	CamThread(void);
	void start();
	void stop();
protected:
	void run();
private:
	Thread^ m_thread;
};
Source:
Код:
CamThread::CamThread(void){
	m_thread = gcnew Thread(gcnew System::Threading::ThreadStart(this,&CamThread::run));
}
void CamThread::start(){
	m_thread->Start();
}
void CamThread::stop(){
        if(m_thread->ThreadState == ThreadState::WaitSleepJoin){
                 m_thread->Interrupt()
        }
	m_thread->Abort();
        delete m_thread;
}
void CamThread::run(){
	while(1){
		// что то делаем
		Thread::Sleep(THREAD_TIMEOUT);
	}
}
Описанный класс, по задумке должен считывать кадры с камеры. А другие классы должны обращаться к нему за кадрами. Проблема в том что после вызова start() в конструкторе главной формы и вызова stop() в деструкторе, программа завершается, а процесс остается висеть в задачах. Исключений также не возникает. Я подозреваю, это из-за неправильного завершения потока camthread. Уже не однократно читал документацию на msdn но не могу понять в ем причина. Пожалуйста объясните в чем может быть подвох.
GeorgeBatyuchenko вне форума Ответить с цитированием
Старый 01.01.2013, 03:31   #2
winhttp
Пользователь
 
Регистрация: 29.07.2012
Сообщений: 98
По умолчанию

Я тоже сталкивался с подобным, нашел решение (возможно оно немного нубское но все же):
я обьявлял глобальную переменную, со начальным значением true . в потоках (у меня их было несколько) обьявлял цикл, который выполняется до тех пор , пока переменнная равна true , иначе цикл завершался, а значит - завершался и поток.
Ну и в обработчике события FormClosed присваиваем нашей глобальной переменной значение false. Это значит, что в потоках циклы завершаются и завершаются потоки .

Последний раз редактировалось winhttp; 01.01.2013 в 03:36.
winhttp вне форума Ответить с цитированием
Старый 01.01.2013, 06:39   #3
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Попробуйте установить свойство потока IsBackground в true, должно помочь
http://msdn.microsoft.com/ru-ru/libr...code-snippet-1
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблема создания потока _beginthreadex Sid111 Visual C++ 12 16.09.2012 17:44
Проблема с выходом за границы диапазона Sanyok77 Общие вопросы Delphi 3 27.04.2012 14:23
Проблема взаимодействия потока с формой Arkuz Общие вопросы Delphi 4 26.02.2010 22:35
Проблема с выходом из системы (Win XP) mutabor Windows 4 15.09.2009 16:12
Проблема с реализацией потока InseR Общие вопросы Delphi 11 19.08.2008 12:20