помогите разобраться с потоком.
if(SpeedButton1->Caption == "Включить")
{
SpeedButton1->Caption = "Выключить";
hMessage = CreateThread(NULL,0,Message, 0, 0, &dwMessageId);
}
else
{
SpeedButton1->Caption = "Включить";
CloseHandle(hMessage);
}
При нажатии на кнопку создается поток. Хэндл передается на hMessage. Но при втором нажатии на кнопку поток должен закрыться, но этого не происходит.
В чем проблема?
Причем возвращается по CloseHandle не ноль, что говорит о закрытии.
Может это быть из-за того что поток работает постоянно в цикле?
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;
}
}
}
По-моему все....
Дело в том, что CloseHandle не закрывает поток, а закрывает только его дескриптор.
Цитата:
Originally posted by man2002ua
Дело в том, что CloseHandle не закрывает поток, а закрывает только его дескриптор.
Дело в том, что CloseHandle не закрывает поток, а закрывает только его дескриптор.
Ну да. Собственно это я и показал в примерах (как мне показалось). Просто немного подробнее :)
Цитата:
Originally posted by man2002ua
Дело в том, что CloseHandle не закрывает поток, а закрывает только его дескриптор.
Дело в том, что CloseHandle не закрывает поток, а закрывает только его дескриптор.
Ну да. Собственно это я и показал в примерах (как мне показалось). Просто намного подробнее :)
не спорю :D
Я просто вызываю TerminateThread(Handle, int Error)
и все.. нету больше потока....
или это не правельно??
Цитата:
Originally posted by Treolorn
Зачем так сложно?
Я просто вызываю TerminateThread(Handle, int Error)
и все.. нету больше потока....
или это не правельно??
Зачем так сложно?
Я просто вызываю TerminateThread(Handle, int Error)
и все.. нету больше потока....
или это не правельно??
В примере SlaF именно эта ф-я и используется...
Цитата:
Originally posted by man2002ua
В примере SlaF именно эта ф-я и используется...
В примере SlaF именно эта ф-я и используется...
Да, но я не делаю никаких флагов. просто закрываю и все. Это нормально?
Цитата:
Originally posted by Treolorn
Да, но я не делаю никаких флагов. просто закрываю и все. Это нормально?
Да, но я не делаю никаких флагов. просто закрываю и все. Это нормально?
нормально, нормально. Каждый программирует как хочет. Хочешь - флаг выставляй, чтобы поток успел перед закрытием выпрлнить какие либо действия.