Добрый день!
А я все же решил попробовать сделать вывод в Excel в другом потоке, т.к. показалось, что это проще с точки зрения реализации.
Для анализа завершения потока дописал в WinApi функции работы с событиями, инфолог из нового потока выводится в основной поток - тут проблемы не возникло.
Однако когда дочерний поток пытается загрузить ресурс с шаблоном файла Excel, все зависает. Объясните, пжл, почему так происходит и можно ли это исправить. Если указать несуществующую ветку, зависания не произойдет. Если не ждать завершения события, то зависания тоже не будет, но мне нужно вывести инфолог, поэтому жду.
Привожу код:
X++:
static void main(Args _args)
{
Thread thread = new thread();
container con;
int handle;
#WinApi
;
handle = WinApi::createEvent();
if(!handle)
throw error('Не удалось создать событие');
thread.removeOnComplete(true);
thread.setInputParm([handle]);
thread.run(classnum(ThreadTest), staticmethodstr(ThreadTest, mainThread));
WinApi::waitForSingleObject(handle, #INFINITE);
con = thread.getOutputParm();
if(con)
info(con2str(con, '\r\n'));
}
X++:
static client void mainThread(thread thread)
{
int i,
eventHandle;
container ret;
container con;
ResourceNode resourceNode;
#AOT
;
resourceNode = TreeNode::findNode(#ResourcesPath + '\\' + _name_); // все зависает
for(i=1; i<=infolog.line(); i++)
{
ret += infolog.text(i);
}
thread.setOutputParm(ret);
eventHandle = conpeek(thread.getInputParm(), 1);
WinApi::setEvent(eventHandle);
}
X++:
client static int createEvent()
{
DLL _dll = new DLL(#KernelDLL);
DLLFunction _function = new DLLFunction(_dll, 'CreateEventW');
;
_function.returns(ExtTypes::DWord); // DWORd
_function.arg(ExtTypes::DWord);
_function.arg(ExtTypes::DWord);
_function.arg(ExtTypes::DWord);
_function.arg(ExtTypes::WString);
return _function.call(0, false, false, '');
}
client static int setEvent(int _handle)
{
DLL _dll = new DLL(#KernelDLL);
DLLFunction _function = new DLLFunction(_dll, 'SetEvent');
;
_function.returns(ExtTypes::DWord); // DWORd
_function.arg(ExtTypes::DWord);
return _function.call(_handle);
}