|
31.07.2014, 16:11 | #1 |
Участник
|
Добрый день!
А я все же решил попробовать сделать вывод в 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); } |
|
Теги |
com-объект, excel, thread, асинхронный com, ошибка |
|
|