AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 31.07.2014, 16:11   #31  
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);
}
Теги
com-объект, excel, thread, асинхронный com, ошибка

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Ошибка времени выполнения DmitryS DAX: Администрирование 5 17.06.2010 13:14
Ошибка времени выполнения: В NumberSeqReference_Empl_RU (Объект), не найден исполнимый код метода "loadModule" Ksju DAX: Функционал 14 21.10.2009 13:00
Ошибка времени выполнения Stas[SNRC] DAX: Программирование 6 12.03.2008 12:21
Ошибка времени выполнения Didukh84 DAX: Программирование 19 06.03.2008 09:11
Ошибка времени выполнения: Binary (Объект), метод string вызван с недопустимыми параметрами. mmm DAX: Программирование 4 15.05.2007 16:00

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 09:55.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.