gibboncho
@gibboncho

Как избавиться от зависания формы при выполнении работы в потоке через Synchronize?

Доброго времени суток. Ситуация такая. Создаю TThread, в нем запускаю функцию через Synchronize, в которой загружается jpeg картинка, переводится в bmp, проводятся операции с с канвой, сжатие, обрезание и тд, потом обратно в jpeg переводится и сохраняется. Так вот в 1 поток эта схема работает на ура, но чем больше потоков, тем больше зависает главная форма на время выполнения скриптов (а они в цикле работают). Код не привожу ибо вопрос по больше части теоретический. Как избавиться от этого зависания?
  • Вопрос задан
  • 522 просмотра
Пригласить эксперта
Ответы на вопрос 2
@Mercury13
Программист на «си с крестами» и не только
Как ни странно, не использовать Synchronize на долгих операциях! Сабж выполняет операцию в главном потоке и, значит, главный поток всё это время не отвечает.

Использовать какую-то структуру данных, в которую главный поток не лезет и надобности в синхронизации нет. А синхронизировать нужно только переключение состояния: поток работает или можно лезть.

Можно использовать PostMessage, правда, никто не знает, когда форма подберёт сообщение и нужно чётко следить за тем, кто чем владеет.
Ответ написан
Комментировать
@DISaccount
Synchronize необходим, когда Вы выполняете операции над визуальными элементами VCL. Поэтому:
в которой загружается jpeg картинка, переводится в bmp

потом обратно в jpeg переводится и сохраняется

делаем без Synchronize.

операции с с канвой

делаем внутри Synchronize.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы