Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CreateThread VS CloseHandle, MS VC 6.0 
:(
    Опции темы
Nuzur
Дата 21.2.2006, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: 3
Всего: 5



Что быдет в результате такого действия:

Код

    DWORD dwThreadID = 0;
    HANDLE hMonitorThread = NULL;

    hMonitorThread = ::CreateThread( NULL, 0,  Func, (void*)pAnalisator, 0, &dwThreadID );

    if( hMonitorThread != NULL )
    {
        CloseHandle(hMonitorThread);
    }


Где
pAnalisator - указатель на клас.
Тоесть, что будет с потоком, если он завершен\незавершен?


--------------------
Never again...
PM MAIL   Вверх
Nuzur
Дата 21.2.2006, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: 3
Всего: 5



Дело все в том что CloseHandle(hMonitorThread) возвращяет 1-цу, что как я понимаю, должно закрыть пток, ну тоесть убить его, но он продолжает свою работу.


--------------------
Never again...
PM MAIL   Вверх
Fin
Дата 21.2.2006, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: 1
Всего: 10



Счетчик у потока выставляется на 2. Когда со стороны вызова ты закрываеш поток, ты просто уменьшаеш счетчик. Пока счетчик не станет равным нулю, поток не будет закрыт.
Более подробно книга Дж. Рихтера "Виндовс - для проффессионалов"

Это сообщение отредактировал(а) Fin - 21.2.2006, 16:40


--------------------
Пролетал мимо.
PM MAIL   Вверх
Nuzur
Дата 21.2.2006, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: 3
Всего: 5



А как уменьшиьт то его?
ТОесть функция CloseHandle не закрывает поток?
Ничего не понимаю, можна подробней?
А то книги у меня нет, да и пока я там найду все позеленеет



--------------------
Never again...
PM MAIL   Вверх
Fin
Дата 21.2.2006, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: 1
Всего: 10



Каждый объект ядра имеет свой счетчик ссылок на данный объект. Когда ты делаеш CloseHandle, ты уменьшаеш счетчик на единицу. И если счетчик станет нулем, винда уничтожает данный объект автоматически.
В книге ничего искать не надо, там целая глава посвяшена только потокам. И книга из разряда Must Have.
Чтобы убить поток, сушествует команда TerminateThread.


--------------------
Пролетал мимо.
PM MAIL   Вверх
Nuzur
Дата 21.2.2006, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: 3
Всего: 5



Самое смешное что даже TerminateThread не работает:

Код

DWORD WINAPI Thread(LPVOID Param)
{

    const delay = 1000;

    Sleep(delay);
    AfxMessageBox("Message from dead thread", IDABORT, NULL);

    return 0;
}

void CThreadDlg::OnOK() 
{    
    DWORD dwThreadId, dwThrdParam = 1; 
    HANDLE hThread = ::CreateThread(NULL, 0, Thread, &dwThrdParam, 0, &dwThreadId);

    if( hThread != NULL )
    {
        BOOL nMes = CloseHandle(hThread);
        TerminateThread(hThread, 0);
    };    
}

И несмотря на все мои труды получаем сообщение ровно по расписанию!



--------------------
Never again...
PM MAIL   Вверх
Fin
Дата 21.2.2006, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: 1
Всего: 10



А оно у тебя и не должно работать. Ты же в начале убил ссылку, а затем уже пытаешся убить поток.
Поставь команды наоборот, и должно работать.
Код

        TerminateThread(hThread, 0);
        Sleep(0);
        BOOL nMes = CloseHandle(hThread);



--------------------
Пролетал мимо.
PM MAIL   Вверх
Nuzur
Дата 21.2.2006, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: 3
Всего: 5



Угу, сработало.
Но суть не втом, тоесть поток пордолжает свое существование после CloseHandle и до какого момента?


--------------------
Never again...
PM MAIL   Вверх
Fin
Дата 21.2.2006, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: 1
Всего: 10



Пока кто либо не завершит поток (TerminateThread) или пока поток не вызовет ExitThread или пока функция потока не будет завершена return.
Последний вариант предпочтительней.

Это сообщение отредактировал(а) Fin - 21.2.2006, 17:38


--------------------
Пролетал мимо.
PM MAIL   Вверх
Nuzur
Дата 21.2.2006, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: 3
Всего: 5



А зачем в таком случае вАще нужен CloseHandle?!?!
Я уже совсем не понимаю его надобность


--------------------
Never again...
PM MAIL   Вверх
Fin
Дата 21.2.2006, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: 1
Всего: 10



Ты в программе получил ссылку на объект ядра. Даже если поток уже не работает, объект ядра остается в памяти. Ты сможеш узнать код завершения и состояние потока. Как только необходимость в этом отпадет, ты должен закрыть ссылку (что собственно и делает CloseHandle). Иначе объект ядра так и останется висеть в памяти, до завершения процесса, вызвавшего данный объект. В маленьких (учебных) программах это не страшно, но в больших может привести к непонятным глюкам. Которые очень трудно отлавливать.
Добавлено @ 17:59
Я например всегда стараюсь в работе придерживаться правила "То что открыл, сразу пиши код на закрытие. Иначе потом забудеш"


--------------------
Пролетал мимо.
PM MAIL   Вверх
Earnest
Дата 21.2.2006, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Nuzur, закрывать поток ф-й TerminateThread можно только в аварийном случае (например, если поток завис\зациклился или в deadlock попал). TerminateThread - это вроде как маникюр топором делать.
Поток нормально завершается только изнутри - путем нормального завершения функции потока. Если нужно предусмотреть способ завершения потока извне, заведи событие и проверяй его в функции потока.



--------------------
...
PM   Вверх
Nuzur
Дата 22.2.2006, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 4.7.2004

Репутация: 3
Всего: 5



Цитата(Earnest @ 21.2.2006, 19:54)
Nuzur, закрывать поток ф-й TerminateThread можно только в аварийном случае (например, если поток завис\зациклился или в deadlock попал). TerminateThread  - это вроде как маникюр топором делать.
Поток нормально завершается только изнутри - путем нормального завершения функции потока. Если нужно предусмотреть способ завершения потока извне, заведи событие и проверяй его в функции потока.

Да все это ясно, посто занимаюсь "поддержкой" кода который уже написан и менять его нельзя, а посему пытаюсь понять логику тех кто его писал.



--------------------
Never again...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0506 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.