Привет все.
Коллеги, обнаружил интересную особенность использования 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++ это однопоточный язык ? Что происходило если несколько тредов одновременно дергали метод инфолога ? Или им везло что одновременно не попадали. Или в ядре есть некая блокировка ресурсов так что пока идет вызов от одного треда, остальные ждут в очереди ). Но ошибок не было.
Кто-нибудь применял эту особенность ? Какие риски есть ? Это явно что-то недокументированное.