Мы вызываем инструмент массового импорта Oracle sqlldr в коде C ++. Мы делаем это путем создания процесса Windows после создания элементов управления, данных и файлов журналов (см. Ниже).
Большую часть времени процесс завершается быстро, и WaitForSingleObject возвращает WAIT_OBJECT_0.
Однако нав некоторых случаях WaitForSingleObject возвращает WAIT_TIMEOUT, указывая, что sqlldr не завершился.
Файлы данных, используемые при превышении времени ожидания процесса, не превышают нормальное значение.
По истечении времени ожидания файл журнала показывает ожидаемоестроки результатов успеха и об ошибках не сообщается.
Наш код убивает процесс после истечения времени ожидания, поэтому мы не можем подтвердить, что sqlldr все еще активен в диспетчере задач, когда истекает время ожидания.
Обычнопоследующий вызов sqlldr через тот же механизм завершается, как и ожидалось, в короткие минуты, и процесс завершается, как и ожидалось.
Кто-нибудь может подсказать, почему иногда не удается завершить работу sqlldr, по крайней мере, в том, что касается процесса Windows?
STARTUPINFO start_info;
memset((void *) &start_info, 0, sizeof(STARTUPINFO));
start_info.cb = sizeof(STARTUPINFO);
start_info.dwFlags = STARTF_USESHOWWINDOW;
start_info.wShowWindow = SW_HIDE;
PROCESS_INFORMATION proc_info;
memset((void *) &proc_info, 0, sizeof(PROCESS_INFORMATION));
CreateProcess(
NULL,
"sqlldr USERID=<user>/<pwd>@<server> CONTROL=<control file> LOG=<log file>",
NULL,
NULL,
FALSE,
CREATE_DEFAULT_ERROR_MODE | CREATE_SUSPENDED,
NULL,
<data file>,
&start_info,
&proc_info);
ResumeThread(proc_info.hThread);
DWORD dwExit = WaitForSingleObject(proc_info.hProcess,<30 minute timeout value>);