• 0
Авторизация  
Winexcel

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

Вопросы

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

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

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

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

Изменено пользователем Winexcel

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


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

3 ответа на этот вопрос

  • 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 пользователей онлайн

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