![]() |
#1 |
Участник
|
![]()
Привет все.
Коллеги, обнаружил интересную особенность использования 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("Конец"); } Что же это получается ? Ядро само открывает новый Thread и разрешает им работать параллельно ? Но ведь они обращаются к разделяемым ресурсам. Например у нас в инфологе написан свой метод заменитель info::messageWinAddLine который пишем инфо в специальную форму написанную на X++ Все запущенные треды джоба обращались при своей работе в этот метод и писали в лог (интересно как ресурсы разделялись, ведь X++ это однопоточный язык ? Что происходило если несколько тредов одновременно дергали метод инфолога ? Или им везло что одновременно не попадали. Или в ядре есть некая блокировка ресурсов так что пока идет вызов от одного треда, остальные ждут в очереди ). Но ошибок не было. Кто-нибудь применял эту особенность ? Какие риски есть ? Это явно что-то недокументированное. Последний раз редактировалось Logger; 16.09.2021 в 13:12. |
|
Теги |
yield |
|
|