Ламерский вопрос, извиняйте:
Я использую в проге несколько потоков, которые создаю как Hang=CreateThread(NULL,NULL,HangFunc,NULL,0,&DWthr.dwHang);
где нужно вызывать CloseHandle(Hang)? Я перепробовал все — в том числе и отсутствие closehandle() — все равно работает, только утечка памяти и все,
а где будет правильнее вызвать? быть может при закрытии программы? (поток может создаваться неоднократно, тобишь повторно!)
Re: Хендл потока
От:
Аноним
Дата:
15.08.05 07:22
Оценка:
Здравствуйте, RMikola, Вы писали:
RM>Ламерский вопрос, извиняйте: RM> Я использую в проге несколько потоков, которые создаю как RM> Hang=CreateThread(NULL,NULL,HangFunc,NULL,0,&DWthr.dwHang); RM> где нужно вызывать CloseHandle(Hang)? Я перепробовал все — в том числе и отсутствие closehandle() — все равно работает, только утечка памяти и все, RM>а где будет правильнее вызвать? быть может при закрытии программы? (поток может создаваться неоднократно, тобишь повторно!)
Почитай МСДН.. Эта функция с багом. Лучше использовать beginthread
RM>>Ламерский вопрос, извиняйте: RM>> Я использую в проге несколько потоков, которые создаю как RM>> Hang=CreateThread(NULL,NULL,HangFunc,NULL,0,&DWthr.dwHang); RM>> где нужно вызывать CloseHandle(Hang)? Я перепробовал все — в том числе и отсутствие closehandle() — все равно работает, только утечка памяти и все, RM>>а где будет правильнее вызвать? быть может при закрытии программы? (поток может создаваться неоднократно, тобишь повторно!)
А>Почитай МСДН.. Эта функция с багом. Лучше использовать beginthread
Здравствуйте, RMikola, Вы писали:
RM>Ламерский вопрос, извиняйте: RM> Я использую в проге несколько потоков, которые создаю как RM> Hang=CreateThread(NULL,NULL,HangFunc,NULL,0,&DWthr.dwHang); RM> где нужно вызывать CloseHandle(Hang)?
там где Hang тебе уже не нужен, если не нужен в принципе, то сразу после CreateThread или _beginthreadex
Здравствуйте, Odi$$ey, Вы писали:
OE>Здравствуйте, RMikola, Вы писали:
RM>>Ламерский вопрос, извиняйте: RM>> Я использую в проге несколько потоков, которые создаю как RM>> Hang=CreateThread(NULL,NULL,HangFunc,NULL,0,&DWthr.dwHang); RM>> где нужно вызывать CloseHandle(Hang)?
OE>там где Hang тебе уже не нужен, если не нужен в принципе, то сразу после CreateThread или _beginthreadex
Спасибо, я так и делал — просто хотел удостоверится, что это правильно!
Здравствуйте, Andrew S, Вы писали:
AS>Эта функция без бага. Баг в CRT.
Не слабо сделать лучше, сохранив интерфейс?
Делай что должно, и будь что будет
Re: Хендл потока
От:
Аноним
Дата:
15.08.05 14:00
Оценка:
в большинстве примеров он закрывается сразу после создания,
если мне память не изменяет то даже у Рихтера было что то вроде
HANDLE hSomeThread = ::CreateThread(......);
::CloseHandle(hSomeThread);
Да и собственно он тебе может понадибицца только по одной причине
если прийдецца гдето ждать окончания потока,
это ::WaitForsingleObject(hSomeThread, INFINITE);
или проверить его остояние.
Здравствуйте, Аноним, Вы писали:
А>в большинстве примеров он закрывается сразу после создания, А>если мне память не изменяет то даже у Рихтера было что то вроде А>HANDLE hSomeThread = ::CreateThread(......); А>::CloseHandle(hSomeThread);
А>Да и собственно он тебе может понадибицца только по одной причине А>если прийдецца гдето ждать окончания потока
будьте аккуратнее. Если вас западозрят в падоночистве, могут забанить.
А>это ::WaitForsingleObject(hSomeThread, INFINITE); А>или проверить его остояние.
Ещё убить, затормозить, продолжить, получить токен, время работы, приоритет.
Здравствуйте, SergH, Вы писали:
А>>если прийдецца гдето ждать окончания потока SH>будьте аккуратнее. Если вас западозрят в падоночистве, могут забанить.
Здравствуйте, adontz, Вы писали:
A>Здравствуйте, SergH, Вы писали:
А>>>если прийдецца гдето ждать окончания потока SH>>будьте аккуратнее. Если вас западозрят в падоночистве, могут забанить.
A>Чё серьзно? За ЦЦ уже банят? Вах, как интресно
Здравствуйте, SergH, Вы писали:
AS>>Эта функция без бага. Баг в CRT. SH> Не слабо сделать лучше, сохранив интерфейс?
Не слабо Всё что beginthread|endthread делают, это выделяют TLS, который используется для хранения промежуточных данных, при обработке исключений. Всё остальное, что они делают можно перенести в другие места.
Выделять же что-то для потока и освобождать (с любыми целями, не только для исключений) можно и в DLL_THREAD_ATTACH/DLL_THREAD_DETACH.
Думаю требование что бы программа была одним EXE-шником без DLL настолько редко встречается, что данную технику вполне моджно применять. Что я и сделал в своё реализации обработки исключений
Честно говоря, учитывая что это MS-extension и что MSVCRT.DLL поставляется с Windows я вообще не понимаю зачем их сделали.
AS>>ключевая фраза — tls callbacks
A>Прикольно. Но ИМХО использование DLL понятнее.
А использование tls callbacks — правильнее. Этот механизм для подобных целей и предназначен. Опять же — статически линкованная CRT (а примеров, когда это _приходится_ делать в моей практике было несколько) — и все, сливай воду на бреющем...
В общем, когда есть возможность сделать что то правильно, лучше это сделать.
Здравствуйте, adontz, Вы писали:
A>Здравствуйте, SergH, Вы писали:
AS>>>Эта функция без бага. Баг в CRT. SH>> Не слабо сделать лучше, сохранив интерфейс?
A>Не слабо Всё что beginthread|endthread делают, это выделяют TLS, который используется для хранения промежуточных данных, при обработке исключений. Всё остальное, что они делают можно перенести в другие места. A>Выделять же что-то для потока и освобождать (с любыми целями, не только для исключений) можно и в DLL_THREAD_ATTACH/DLL_THREAD_DETACH.
Я вкурсе. Я даже Рихтера читал.
A>Думаю требование что бы программа была одним EXE-шником без DLL настолько редко встречается, что данную технику вполне моджно применять. Что я и сделал в своё реализации обработки исключений
Т.е. пользователю надо таскать с собой dll? Это изменение интерфейса. Раньше не надо было и работало, а теперь приходится совершать дополнительные действия.
A>Честно говоря, учитывая что это MS-extension и что MSVCRT.DLL поставляется с Windows я вообще не понимаю зачем их сделали.
Во-первых, последние версии не поставляются. Насколько я помню, в dll из VS.2003 нет нигде, кроме 2003 Server, да и он под подозрением. Во=-вторых, есть отладочные версии, которые не поставляются вообще.