Перейти к содержанию
Fire Monkey от А до Я
  • 0

Разница в вызовах Synchronize


Winexcel

Вопрос

Здравствуйте, объясните пожалуйста разницу между вызовами

TThread.Synchronize(nil, procedure begin {код работающий с FMX компонентами} end);

TThread.Synchronize(TThread.Current, procedure begin {код работающий с FMX компонентами} end);

Это одно и тоже или есть разница какая-то важная?

Изменено пользователем Winexcel
Ссылка на комментарий

Рекомендуемые сообщения

  • 1

http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.Classes.TThread.Synchronize

Судя по документации, если передать первым параметром поток, то в дальнейшем в основном потоке можно будет определить какой из дополнительных потоков вызвал метод. Если это не требуется, то можно ничего не передавать.

Ссылка на комментарий
  • 1
2 часа назад, Winexcel сказал:

или есть разница какая-то важная?

Разница есть. И она не только в вызове Synchronize, но и Queue.

Указание потока в качестве источника метода синхронизации позволяет вам впоследствии сделать TThread.RemoveQueuedEvents(myThread) перед его удалением.

Вызов RemoveQueuedEvents необходим, если в синхронизируемых методах может идти обращение к полям и методам уничтожаемого потока. Потому что с удалением потока то, что подлежало синхронизации, никуда не пропадет, а раз поток уже не существует - у вас вылезет AV на ровном месте. Или же ваш код испортит чью-то память, что еще труднее отловить.

Ссылка на комментарий
  • 0

Поправка: RemoveQueuedEvents  вызывается само в деструкторе TThread.

Если важно, чтобы все синхронизируемые события отработали - при уничтожении TThread в главном потоке нужно вызывать System.Classes.CheckSynchronize(0) до того момента, как оно вернет False.

Ссылка на комментарий
  • 0
В 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);

Подскажите как с этим борются правильно. Спасибо.

 

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...