Перейти к содержанию
  • Регистрация
  • 0
Авторизация  
Winexcel

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

Вопрос

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

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

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

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

Авторизация  

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

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

×
×
  • Создать...