Здравствуйте, Sergey Larionov, Вы писали:
SL>В чём может быть дело? Из-за чего потоки могут не закрываться?
Кстати, у меня в потоки передаются хендлы процессов, пайпов и евентов.
я делаю это так:
THREAD_PARAMS *param = new THREAD_PARAMS
param->ev_terminate = CreateEvent(
NULL, // default security attributes
FALSE, // manual-reset event
FALSE, // initial state is signaled
(boost::wformat(L"terminate_pinger_%1%")%t->process_id).str().c_str() // object name
);
param->hPipeRd = hChildStdoutRdDup;
param->hPipeWr = hChildStdinWrDup;
DuplicateHandle( GetCurrentProcess (), param->ev_terminate, GetCurrentProcess() ,&(t->ev_terminate), 0, false, DUPLICATE_SAME_ACCESS);
DuplicateHandle( GetCurrentProcess (), param->hPipeRd, GetCurrentProcess() ,&(t->rd), 0, false, DUPLICATE_SAME_ACCESS);
DuplicateHandle( GetCurrentProcess (), param->hPipeWr, GetCurrentProcess() ,&(t->wr), 0, false, DUPLICATE_SAME_ACCESS);
hThread = (HANDLE)_beginthreadex(
NULL,
0,
&convertor_listener,
(void *) param,
0,
&dwThreadId );
Затем в потоке они закрываются
UINT __stdcall convertor_listener(void *lpvParam)
{
THREAD_PARAMS *params = (THREAD_PARAMS *)lpvParam;
...
CloseHandle(params->ev_terminate);
CloseHandle(params->hPipeRd);
CloseHandle(params->hPipeWr);
CloseHandle(params->siStartInfo.hStdInput);
CloseHandle(params->siStartInfo.hStdOutput);
return 0;
}
Правильно делать Duplicate вообще, правильно ли в вызывающем потоке?