Показать сообщение отдельно
Старый 16.09.2021, 13:04   #1  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,873 / 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.