Показать сообщение отдельно
Старый 31.07.2014, 16:11   #39  
byte is offline
byte
Участник
 
36 / 31 (2) +++
Регистрация: 21.08.2007
Добрый день!

А я все же решил попробовать сделать вывод в 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);
}