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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.09.2021, 13:04   #1  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,875 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
? infolog.yield() так что же он делает ?
Привет все.
Коллеги, обнаружил интересную особенность использования infolog.yield()

Если запустить в аксапте какой то долгий циклический процесс то пока она думает другие открытые окна остаются недоступными. Даже зачастую не перерисовываются нормально.

Это ок. Так всегда и было.
Пример, джоб ниже.
X++:
static void TestSysOperationProgress(Args _args)
{
    SysOperationProgress progress;
    int             seconds = 300;
    int             total = seconds * 200;
    int     i;
    ;

    info("TestSysOperationProgress");

    progress = SysOperationProgress::construct();
    progress.setCaption("TestSysOperationProgress");
    progress.setTotal(total);

    for (i = 1; i <= total; i++)
    {
        progress.incCount();
        progress.setText(strFmt("%1/%2", progress.getCount_RU(), progress.getTotal()));
        progress.update(true);
        sleep(5);
        infolog.yield(); // вглючаем колдунство ! ! !
    }

    info("Конец");
}
Но если в этом джобе на каждом шаге добавить infolog.yield() то магическим образом все разблокируется. Окошки перерисовываются все. Пока работает джоб, можно ходить по окнам! Переключаться по разным формам. В самой среде разработки можно попытаться запустить этот же джоб повторно и он с некоторой вероятностью запустится (если нажимать не F5 а тыкать зеленую стрелку в окошке джоба то вероятность успеха повторного запуска намного выше). Можно таким образом запустить параллельно 5 потоков с джобом и это будет отражено в инфологе (там будет в одной форме 5 прогрессбаров - их ядро отрисовывает).

Что же это получается ?
Ядро само открывает новый Thread и разрешает им работать параллельно ?
Но ведь они обращаются к разделяемым ресурсам.

Например у нас в инфологе написан свой метод заменитель info::messageWinAddLine который пишем инфо в специальную форму написанную на X++
Все запущенные треды джоба обращались при своей работе в этот метод и писали в лог (интересно как ресурсы разделялись, ведь X++ это однопоточный язык ? Что происходило если несколько тредов одновременно дергали метод инфолога ? Или им везло что одновременно не попадали. Или в ядре есть некая блокировка ресурсов так что пока идет вызов от одного треда, остальные ждут в очереди ). Но ошибок не было.

Кто-нибудь применял эту особенность ? Какие риски есть ? Это явно что-то недокументированное.

Последний раз редактировалось Logger; 16.09.2021 в 13:12.
Теги
yield

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Axilicious:Propagate infolog messages to the windows event log Blog bot DAX Blogs 0 04.11.2011 10:14
gatesasbait: How to temporarily suppress infolog messages in Dynamics Ax (deux) Blog bot DAX Blogs 7 28.01.2009 17:45
DAX 4.0: infolog & workspaceNum petergunn DAX: Программирование 3 22.01.2009 11:32
Kashperuk Ivan: SysInfoAction class description - Improve your Infolog Blog bot DAX Blogs 0 17.09.2008 03:23
casperkamal: Customizing Infolog through SysInfoAction Blog bot DAX Blogs 0 30.01.2007 20:20

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

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

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