Winexcel Опубликовано 16 декабря, 2017 Поделиться Опубликовано 16 декабря, 2017 (изменено) Здравствуйте, объясните пожалуйста разницу между вызовами TThread.Synchronize(nil, procedure begin {код работающий с FMX компонентами} end); TThread.Synchronize(TThread.Current, procedure begin {код работающий с FMX компонентами} end); Это одно и тоже или есть разница какая-то важная? Изменено 16 декабря, 2017 пользователем Winexcel Цитата Ссылка на комментарий
1 Maximus Опубликовано 16 декабря, 2017 Поделиться Опубликовано 16 декабря, 2017 http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.Classes.TThread.Synchronize Судя по документации, если передать первым параметром поток, то в дальнейшем в основном потоке можно будет определить какой из дополнительных потоков вызвал метод. Если это не требуется, то можно ничего не передавать. Ingalime, Winexcel и Brovin Yaroslav 3 Цитата Ссылка на комментарий
1 kami Опубликовано 16 декабря, 2017 Поделиться Опубликовано 16 декабря, 2017 2 часа назад, Winexcel сказал: или есть разница какая-то важная? Разница есть. И она не только в вызове Synchronize, но и Queue. Указание потока в качестве источника метода синхронизации позволяет вам впоследствии сделать TThread.RemoveQueuedEvents(myThread) перед его удалением. Вызов RemoveQueuedEvents необходим, если в синхронизируемых методах может идти обращение к полям и методам уничтожаемого потока. Потому что с удалением потока то, что подлежало синхронизации, никуда не пропадет, а раз поток уже не существует - у вас вылезет AV на ровном месте. Или же ваш код испортит чью-то память, что еще труднее отловить. dnekrasov, Winexcel, Maximus и 3 других 4 2 Цитата Ссылка на комментарий
0 kami Опубликовано 18 декабря, 2017 Поделиться Опубликовано 18 декабря, 2017 Поправка: RemoveQueuedEvents вызывается само в деструкторе TThread. Если важно, чтобы все синхронизируемые события отработали - при уничтожении TThread в главном потоке нужно вызывать System.Classes.CheckSynchronize(0) до того момента, как оно вернет False. Евгений Корепов 1 Цитата Ссылка на комментарий
0 SVTX Опубликовано 17 августа, 2022 Поделиться Опубликовано 17 августа, 2022 В 18.12.2017 в 06:46, kami сказал: Поправка: RemoveQueuedEvents вызывается само в деструкторе TThread. Если важно, чтобы все синхронизируемые события отработали - при уничтожении TThread в главном потоке нужно вызывать System.Classes.CheckSynchronize(0) до того момента, как оно вернет False. Уважаемый Kami очень прошу помощи. Внедрили в IOS костыль TThread.ForceQueue для ShowModal и получили кучу ошибок как Вы и пишете. Так как Вы явно понимаете суть работы, посмотрите что можно сделать и подскажите. Итак что мы делаем почти везде Надо создать динамически форму, сделать ей ShowModal (для этого используем в IOS TThread.ForceQueue) и освободить форму после завершения. Примерно так. FFrom := TFrom.Create(nil); TThread.ForceQueue(nil, procedure begin FFrom .ShowModal(procedure(Res: TModalResult) begin FreeForm(FFrom); //--> и тут получаем кучу ошибок - как правило на Form.Hide почемуто end); end); Подскажите как с этим борются правильно. Спасибо. Цитата Ссылка на комментарий
Вопрос
Winexcel
Здравствуйте, объясните пожалуйста разницу между вызовами
TThread.Synchronize(nil, procedure begin {код работающий с FMX компонентами} end); TThread.Synchronize(TThread.Current, procedure begin {код работающий с FMX компонентами} end);
Это одно и тоже или есть разница какая-то важная?
Изменено пользователем WinexcelСсылка на комментарий
4 ответа на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.