Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / "Убить" поток / 11 сообщений из 11, страница 1 из 1
23.03.2007, 14:50
    #34411833
ThreadKiller
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Убить" поток
Есть поток, созданный CreateThread. В нем выполняется бесконечный цикл. Как "убить" поток?
...
Рейтинг: 0 / 0
23.03.2007, 15:00
    #34411886
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Убить" поток
Цикл должен быть прерываемым. Можно банально через глобальную переменную, которая будет служить признаком окончания потока, можно через событие (event) можно еще как-то. Главное, чтобы поток добровольно прервал работу.
...
Рейтинг: 0 / 0
23.03.2007, 15:22
    #34411980
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Убить" поток
только volatile не забудьте, а то я уже знаю следующий вопрос :(
...
Рейтинг: 0 / 0
23.03.2007, 16:01
    #34412164
ThreadKiller
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Убить" поток
Создал глобальную переменную int extThread . В CreateForm
Код: plaintext
extThread =  0 ;
В потоке бесконечный прерываемый цикл
Код: plaintext
1.
2.
3.
extThread  =  1 ;
while(extThread  ==  1 ){
...
}
На кнопку "остановки" вешаю
Код: plaintext
extThread  =  0 ;
При нажатии кнопки останова поток продолжает работу.
...
Рейтинг: 0 / 0
23.03.2007, 16:05
    #34412178
ThreadKiller
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Убить" поток
Gluk (Kazan)только volatile не забудьте, а то я уже знаю следующий вопрос :(
И если объявить гловальную переменную через volatile int extThread . То всё равно не завершает поток работу свою
...
Рейтинг: 0 / 0
23.03.2007, 16:26
    #34412259
--null--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Убить" поток
это конечно не очень корректно
но может TerminateThread
...
Рейтинг: 0 / 0
23.03.2007, 16:35
    #34412296
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Убить" поток
А в обработчик точно входит? Складывается такое впечатление, что ваш бесконечный цикл не дает GUI обработать очередь сообщений.
...
Рейтинг: 0 / 0
23.03.2007, 17:20
    #34412463
ThreadKiller
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Убить" поток
Нажатие кнопки запуска
Код: plaintext
1.
2.
int Pr =  0 ;
DWORD ThreadId =  0 ;
CreateThread(NULL,  0 , (LPTHREAD_START_ROUTINE) threed1, &P,  0 , (LPDWORD) & ThreadId);
Собсна сам поток-процедура
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 void threed1(){
         int id =  0 ;
         while (exitCode ==  1 ){
                SleepEx( 1000 , false);
                if (detect() ==  0 ) 
                        id = get_id();
                    
         }
...
Рейтинг: 0 / 0
23.03.2007, 17:25
    #34412485
ThreadKiller
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Убить" поток
Сорри
Нажатие кнопки запуска
Код: plaintext
1.
2.
int Pr =  0 ;
DWORD ThreadId =  0 ;
CreateThread(NULL,  0 , (LPTHREAD_START_ROUTINE) threed1, &P,  0 , (LPDWORD) & ThreadId);
Собсна сам поток-процедура
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 void threed1(){
         int id =  0 ;
         exitCode = 1 ;
         while (exitCode ==  1 ){
                SleepEx( 1000 , false);
                if (detect() ==  0 ) 
                        id = get_id();
                    
         }
Забыл добавить:
Объявление
Код: plaintext
volatile int exitCode;
CreateForm
Код: plaintext
exitCode =  0 ;
Кнопка СТОП
Код: plaintext
exitCode =  0 ;
...
Рейтинг: 0 / 0
23.03.2007, 20:26
    #34412830
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Убить" поток
2 ThreadKiller

Очень жаль, что вы показываете форуму только ключевые фрагменты исходников. Или вы считаете, что в скрытом коде нет никаких ошибок?

Добавьте хотя-бы вывод на экран (или в DEBUG output (или в файл)) состояния переменной exitCode.
...
Рейтинг: 0 / 0
23.03.2007, 23:57
    #34413044
ThreadGuard
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
"Убить" поток
2 ThreadKiller
Полезно было бы почитать вот это, например:
http://doks.gorodok.net/?p=555#h6
ну и дальше главы по синхронизации... ну и потом ещё от начала до конца ;)

А вообще непонятно из-за чего возникли проблемы...
Элемантарный рабочий пример (BCB 6):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
HANDLE hThread;
unsigned ThreadId;
volatile bool exitflag;
HANDLE formHandle;
int counter =  0 ;
//---------------------------------------------------------------------------
unsigned __stdcall ThreadFunc(void* ArgList)
{
    exitflag = false;
    while( !exitflag )
    {
        Sleep( 500 );
        PostMessage(formHandle,WM_USER+ 1 , 0 , 0 );
    }
    return  0 ;
}
//---------------------------------------------------------------------------
void __fastcall TFThreadTest::BtnStartClick(TObject *Sender)
{
    hThread = (HANDLE)_beginthreadex(NULL,  0 , ThreadFunc, NULL,  0 , &ThreadId);
}
//---------------------------------------------------------------------------
void __fastcall TFThreadTest::FormCreate(TObject *Sender)
{
    formHandle = Handle;
}
//---------------------------------------------------------------------------
//ловим WM_USER+1, присланный из потока
void __fastcall TFThreadTest::Msg(TMessage &Message)
{
    Label->Caption = IntToStr(++counter);
}
//---------------------------------------------------------------------------
void __fastcall TFThreadTest::BtnStopClick(TObject *Sender)
{
    exitflag = true;    
}
//---------------------------------------------------------------------------
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / "Убить" поток / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]