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

Ваш аккаунт

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

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

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

помогите разобраться с потоком.

494
27 ноября 2002 года
Treolorn
30 / / 20.06.2000
При нажатии на кнопку происходит:

if(SpeedButton1->Caption == "Включить")
{
SpeedButton1->Caption = "Выключить";
hMessage = CreateThread(NULL,0,Message, 0, 0, &dwMessageId);
}
else
{
SpeedButton1->Caption = "Включить";
CloseHandle(hMessage);
}

При нажатии на кнопку создается поток. Хэндл передается на hMessage. Но при втором нажатии на кнопку поток должен закрыться, но этого не происходит.
В чем проблема?
Причем возвращается по CloseHandle не ноль, что говорит о закрытии.
Может это быть из-за того что поток работает постоянно в цикле?
2.8K
29 ноября 2002 года
SlaF
3 / / 29.11.2002
Попробуй:
HANDLE h = CreateThread (...);
CloseHandle (h);
Поток отлично запустится, прекрасно будет работать дальше.
Даже можно:

UINT WINAPI thread_fnc (void *p)
{
CloseHandle (*((HANDLE**)p));
for (;;) {
}
return 0;
}

int main (void)
{
HANDLE h;
h = CreateThread (thread_fnc, (void*)(&h), CREATE_SUSPENDED);
ResumeThread (h);
...
}

Поэтому чтобы грохнуть поток нужно либо создавать bool переменную (либо глобальную, либо static в class'e) или же классично Event...:

Пример:

bool exit_thread = false;
HANDLE h = NULL;

UINT WINAPI thread_func2 (void *p)
{
while (!exit_thread) {
...
}
return 0;
}

void OnButton ( *Sender)
{
if (...)
{
exit_thread = false;
h = CreateThread (thread_func2, ...)
}
else
{
if (h) {
exit_thread = true;
if (WaitForSingleObject (h, Timeout/*ms*/) == WAIT_TIMEOUT)
TerminateThread (h);
CloseHandle (h);
h = NULL;
}
}
}

По-моему все....
476
29 ноября 2002 года
man2002ua
218 / / 16.10.2002
Дело в том, что CloseHandle не закрывает поток, а закрывает только его дескриптор.
2.8K
29 ноября 2002 года
SlaF
3 / / 29.11.2002
Цитата:
Originally posted by man2002ua
Дело в том, что CloseHandle не закрывает поток, а закрывает только его дескриптор.



Ну да. Собственно это я и показал в примерах (как мне показалось). Просто немного подробнее :)

2.8K
29 ноября 2002 года
SlaF
3 / / 29.11.2002
Цитата:
Originally posted by man2002ua
Дело в том, что CloseHandle не закрывает поток, а закрывает только его дескриптор.



Ну да. Собственно это я и показал в примерах (как мне показалось). Просто намного подробнее :)

476
30 ноября 2002 года
man2002ua
218 / / 16.10.2002
не спорю :D
494
07 декабря 2002 года
Treolorn
30 / / 20.06.2000
Зачем так сложно?

Я просто вызываю TerminateThread(Handle, int Error)
и все.. нету больше потока....

или это не правельно??
476
07 декабря 2002 года
man2002ua
218 / / 16.10.2002
Цитата:
Originally posted by Treolorn
Зачем так сложно?

Я просто вызываю TerminateThread(Handle, int Error)
и все.. нету больше потока....

или это не правельно??



В примере SlaF именно эта ф-я и используется...

494
08 декабря 2002 года
Treolorn
30 / / 20.06.2000
Цитата:
Originally posted by man2002ua


В примере SlaF именно эта ф-я и используется...



Да, но я не делаю никаких флагов. просто закрываю и все. Это нормально?

476
09 декабря 2002 года
man2002ua
218 / / 16.10.2002
Цитата:
Originally posted by Treolorn


Да, но я не делаю никаких флагов. просто закрываю и все. Это нормально?



нормально, нормально. Каждый программирует как хочет. Хочешь - флаг выставляй, чтобы поток успел перед закрытием выпрлнить какие либо действия.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог