Показать сообщение отдельно
  #7  
Старый 14.03.2012, 09:15
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Цитата:
Сообщение от kiman.ru
Да, мне интересно почему так происходит.

При вызове функции копирования (а вызываешь ты ее из главного потока программы) поток тормозится до окончания выполнения функции, по сути ждет ее завершения. В это время никакие сообщения им не обрабатываются. И как бы ты не старался из паралельного потока изменить визуальные компоненты (а за их отрисовку отвечает главный поток программы) у тебя ничего не получится (не будем тут углублятся в вопрос о том, что поток изменения кнопки у тебя написан не правильно, сути дела это не меняет). Сообщения отправлненные главному потоку просто "толпятся" в очереди до окончания работы функции копирования файла. По большому счету - если функция копирования не вернет управление программе, то программа "зависнет" в ожидании. Из диспетчера задач это будет выглядеть так: "Программа не отвечает". Как только копирование завершено (функция вернула результат), главный поток программы начинает обрабатывать накопившуюся очередь сообщений, и программа "отвисает".
На примере такое поведение видно при установке некоторых игр (у которых инсталятор кривой). Если инсталятор игры содержит большой контейнер с файлами (архив), то при его открытии (для установки) антивурус перехварывает процедуру открытия файла и начинает проверять файлы из ахива, если файлов много (очень много или дофига) и инсталятор кривенький, то создается впечатление что установка зависла.
Вот примерно так.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием