Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.12.2010, 14:57   #1
Freezer
Пользователь
 
Аватар для Freezer
 
Регистрация: 04.02.2007
Сообщений: 37
По умолчанию Корректная прорисовка с занятым основным потоком??

Здравствуйте!
У меня следующая проблема. Нужно показать форму с анимацией или бегающим прогресбаром перед выполнением длидельного процеса. Процесс выполняется в основном потоке программы, перенести в отдельный поток не могу и вставить строчку типа Form2.Refresh тоже, так так выполняется скрипт. Возможно ли как то организовать показ формы независимо, чтобы сама прорисовывалась???

Чтобы можно было что-то типа:
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
begin
  ShowProgressIndicator;
  try
    /// выполнение скрипта
  finally
    HideProgressIndicator;
  end;
end;
Пробовал отдельным потоком посылать меседжы на прорисовку - не идет, основной поток обрабатывает их уже после завершения скрипта.
Так же пробовал засунуть форму в DLL, но все равно у меня прорисовком занимается основной поток.
Пробовал создавать отдельный TApplication в DLLке, тоже не пошло.

Есть ли какие-то идеи как это сделать??
Не грузи, и не грузим будешь...
Freezer вне форума Ответить с цитированием
Старый 01.12.2010, 15:19   #2
_Engine_
Форумчанин
 
Регистрация: 29.06.2008
Сообщений: 603
По умолчанию

Тут недавно, чтобы особо не заморачиваться потоками, посоветовали попробовать
http://www.delphikingdom.ru/asp/arti...ArticleID=1355
_Engine_ вне форума Ответить с цитированием
Старый 01.12.2010, 16:13   #3
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Скрипт как выполняется? Может Application.ProcessMeseges прокатит?
psycho-coder вне форума Ответить с цитированием
Старый 01.12.2010, 17:43   #4
Freezer
Пользователь
 
Аватар для Freezer
 
Регистрация: 04.02.2007
Сообщений: 37
По умолчанию

Цитата:
Сообщение от _Engine_ Посмотреть сообщение
Тут недавно, чтобы особо не заморачиваться потоками, посоветовали попробовать
http://www.delphikingdom.ru/asp/arti...ArticleID=1355
Довольно интересно, но в данном случае не подойдет. Прогрес должен показываться и вовремя создания и загрузки напр. редактора скриптов (5-7сек), а там работа с формами, поэтому создание совать в поток никак не выйдет.

Цитата:
Скрипт как выполняется? Может Application.ProcessMeseges прокатит?
Скрипт выполняется движком FastScript, а там про многопоточность можно забыть. И лезть в скрипт с Application.ProcessMeseges тоже не выйдет, на этапе проектирования я не знаю что там за код будет. С отдельного же потока вызов Application.ProcessMeseges ничего не дал. Поток на нем стопорится и ждет пока собственно сам Application не освободится чтобы сделать ProcessMeseges.

Где-то нашел информацию что это можно сделать через ручную загрузку DLL, но в всех примерах форму из DLL наоборот стараются подсунуть приложению "как родную", мне же нужно наоборот.
Не грузи, и не грузим будешь...
Freezer вне форума Ответить с цитированием
Старый 02.12.2010, 09:47   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

У DLL есть свой application но нет цикла обработки сообщений ( application.run ).
попробуй загрузить DLL и запустить там такой цикл програмно(если получится),. Правда как управлять им извне (чтобы закончить по завершению скрипта) и как он будет себя вести мне не понятно.
Если он будет в том же потоке что и скрипт то работать будет что-то одно (скрипт или цикл(Run)?
Если в разных потоках будут ли идти сообщения чтобы работал Application.run?
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 02.12.2010, 11:05   #6
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Интересно. Очень интересно... Есть над чем подумать
psycho-coder вне форума Ответить с цитированием
Старый 02.12.2010, 12:25   #7
Freezer
Пользователь
 
Аватар для Freezer
 
Регистрация: 04.02.2007
Сообщений: 37
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
У DLL есть свой application но нет цикла обработки сообщений ( application.run ).
попробуй загрузить DLL и запустить там такой цикл програмно(если получится),. Правда как управлять им извне (чтобы закончить по завершению скрипта) и как он будет себя вести мне не понятно.
Если он будет в том же потоке что и скрипт то работать будет что-то одно (скрипт или цикл(Run)?
Если в разных потоках будут ли идти сообщения чтобы работал Application.run?
Ничего не вышло. Если брать в dll'ке
Код:
Application.CreateForm(TfmProgressIndicator, MyForm);
Application.Run;
то проект вроди никак не реагирует, но слетает с ошибками при закрытии.

Попробовал создать свою переменную DllApp : TApplication,
Код:
  DllApp := TApplication.Create(nil);
  DllApp.Initialize;
  DllApp.CreateForm(TfmProgressIndicator, MyForm);
  DllApp.Run;
Поведение интересное, код стопориться на DllApp.Run, показывается дочерняя форма, далее вроде все нормально, GUI работает и т.п. если нажать на закрытие основной формы проекта то код начинает идти дальше. как будто мы прибили DllApp и основной Application дальше работает нормально. При втором нажатии на закрыть основную форму все корректно завершается.

При исполнении этих же действий но в отдельном потоке dll'ки следующее поведение:
При работе с Application - форма не показывается, проект начинает тупо реагировать на действия юзера слетает при закрытии.
При работе с DllApp - форма показывается и вроде все нормально, вот только все равно она обрабатывается основным Application программы и, как следствие, стопориться прорисовка при занятости основного потока.

Есть идеи????
Не грузи, и не грузим будешь...
Freezer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
mingw32-g++ и msvs6 не корректная работа fstream под windows Asain-Asa Общие вопросы C/C++ 1 18.11.2009 00:06
Корректная закачка файлов. Dj_smart Работа с сетью в Delphi 3 26.03.2009 16:57
Корректная печать объединенных ячеек zloy_nick Microsoft Office Excel 5 26.02.2009 16:21
Работа с файлом, занятым другим процессом Viteef Общие вопросы Delphi 3 10.05.2007 20:45