Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];

Вниз

Как правильно сделать форму-заставку в отдельном потоке?   Найти похожие ветки 

 
garry79 ©   (2004-04-18 09:01) [0]

А то у меня ругается чото "Acsess violation". С потоками раньше не работал. Ругается на Create, Execute вообще не выполняется (не доходит видимо). Код такой:

type
 TSplashTread = class(TThread)
 private
 procedure CrForm;
   { Private declarations }
 protected
   procedure Execute; override;
 public
   procedure Terminate;
 end;

{ TSplashTread }

procedure TSplashTread.Execute;
begin
//создаем форму
Synchronize(CrForm);
end;

procedure TSplashTread.CrForm;
begin
with TForm_Splash.Create(nil) do
   begin
   Panel_Connect.Visible:=true;
   end;
end;

procedure TSplashTread.Terminate;
begin
if Form_Splash<>nil then
  try Form_Splash.Close; except end;
inherited Terminate;
end;


вызывается:

SplashTread.create(true);


 
хз ©   (2004-04-18 09:26) [1]

Где вызывается:

SplashTread:=TSplashTread.create(true);
  SplashTread.Resume;

НО! Говорю сразу - весь вышеописаный код (и твой и мой) - бред. Так никто не делает. Расписывать как надо лень, а потому покопайся в сети, там много материалов по этому поводу.


 
Mim1   (2004-04-18 10:41) [2]

А зачем нужна заставка в отдельном потоке. Ведь очередь сообщений обрабатывается в основном потоке. Может сделать и заставку тамже?
Если нада примером поделюсь.


 
KSergey ©   (2004-04-18 11:02) [3]

> procedure TSplashTread.Execute;
> begin
> //создаем форму
> Synchronize(CrForm);
> end;

Пример как НЕнадо делать потоки, вернее как делать их - бессмысленно
Подробности см. в принципах работы метода Synchronize

А нафига вообще потоки сдались? Заняться более не чем??


 
y-soft ©   (2004-04-18 11:21) [4]

Задача не такая уж и бессмысленная, возникает довольно часто.

Например, приложение при запуске довольно долго инициализируется - чтобы пользователь не уснул, обычно выводят анимированную заставку. Гораздо удобнее делать это в отдельном потоке с минимумом синхронизаций с основным, но работать приходится на чистом WinAPI из-за остутствия потокозащищенности в классе TForm...

На Borland.Community есть пример...


 
Mim1   (2004-04-18 12:47) [5]

y-soft ©   (18.04.04 11:21) [4]

Можно пользователю киношку показывать пока программа грузится. :)
Не могли бы вы уточнить ссылку.


 
y-soft ©   (2004-04-18 16:50) [6]

>Mim1   (18.04.04 12:47) [5]

Peter Below. Threaded Splashscreen for Delphi

http://codecentral.borland.com/codecentral/ccWeb.exe/listing?id=20139


 
Гаврила   (2004-04-18 17:52) [7]

>>y-soft ©   (18.04.04 11:21) [4]

я вот одного не пойму никак - зачем дополнительный поток ?
всю жизнь делали это в основном потоке, и никто не жаловался


 
Mim1   (2004-04-18 18:01) [8]

Гаврила   (18.04.04 17:52) [7]

В отдельном потоке анимация будет гарантировано работать, и отрисовка тоже.
Хотя извращение имхо, вмето пяти строк кода делать более 200 (как в примере).


 
Гаврила   (2004-04-18 18:04) [9]

>>Mim1   (18.04.04 18:01) [8]
если обрабатывать сообщения, то она и в основном потоке неплохо отработает


 
Mim1   (2004-04-18 18:06) [10]

В основном потоке происходи процесс создания форм, и другая работа, так что очередь сообщений не обрабатывается.


 
Гаврила   (2004-04-18 18:13) [11]

>>Mim1   (18.04.04 18:06) [10]
ладно, врать не буду насчет анимации
но просто форма без анимации отрисуется нормально
достаточно либо вызвать Application.ProcessMessages
либо директивно перерисовать окно - заставку
и еще правило хорошего тона - рушить ее с помощью Release
то есть как только начнут обрабатываться сообщения - оно сразу разрушится


 
y-soft ©   (2004-04-18 18:26) [12]

>Гаврила   (18.04.04 17:52) [7]
>>y-soft ©   (18.04.04 11:21) [4]

>я вот одного не пойму никак - зачем дополнительный поток ?
>всю жизнь делали это в основном потоке, и никто не жаловался

В простых приложениях это так. Если же нужно что-то сложнее простого показа заставки, то с отдельным потоком программа получится структурно красивее. Опять-таки, как правильно заметил Mim1 [10], исчезнут все проблемы, связанные с очередью сообщений первичного потока...

Вообще-то конечно методологически правильнее везде, где можно, выносить в отдельный поток не окно заставки, а долговременные операции инициализации... Но - всяко бывает...


 
garry79 ©   (2004-04-18 20:59) [13]

В общем повозился немного, поток заработал, заставка отрисовывается... НО после выполнения долгосрочной операции, посему вопрос: как сделать, чтоб параллельно с ней, все дело скорее всего в Syncronize, но где же там ситуация гонок, я вроде не цепляюсь к основным формам? приведу на всякий случай новый вариант кода:

procedure TForm_Splash.FormClose(Sender: TObject;
 var Action: TCloseAction);
begin
Form_Splash:=nil;
Action:=caFree;
end;

{ TSplashTread }

procedure TSplashTread.Execute;
begin
//создаем форму
Synchronize(CrForm);
end;

procedure TSplashTread.Refr;
begin
Form_Splash.Refresh;
end;

procedure TSplashTread.CrForm;
begin
//showmessage("начато создание формы");
if Form_Splash=nil then Form_Splash:=TForm_Splash.Create(nil) //Application.CreateForm (TForm_Splash,Form_Splash)
else Form_Splash.show;

with Form_Splash do
   begin
   autosize:=true;
   Panel_Connect.Visible:=false;
   Panel_ToExcel.Visible:=false;
   myMode:=fmMode; //инициализируем режим формы
   case myMode of
   fmConnect:
        Panel_Connect.Visible:=true;
   fmToExcel:
        Panel_ToExcel.Visible:=true;
   end;      
   CanMeClose:=false;
   Timer1.Enabled:=true;
   end;
end;

//Уничтожение потока и закрытие формы
procedure TSplashTread.Terminate;
begin
if Form_Splash<>nil then
  begin
  //Form_Splash.Close;
   //разрешаем (таймеру) закрытие(скрытие) формы
  Form_Splash.CanMeClose:=true;
  end;
inherited Terminate;
end;

//Создание потока
constructor TSplashTread.Create(AMode : TfmMode);
begin
inherited Create(True);
FreeOnTerminate := True;
Self.Priority := tpHighest; //!высокий приоритет
fmMode:=AMode;
resume; //запускаем
end;


вызывается как в статье отсюда:
TrHdl := Integer(TSplashTread.Create(fmConnect));


 
garry79 ©   (2004-04-18 21:07) [14]

Гаврила
Можно поподробней, как работать с Application.ProcessMessages,
когда вызывать, что еще делать?
в общем если в основном можно сделать правильно заставку то это хорошо , главное чтоб прорисовывалась, и метки на ней, которые я меняю тоже.
А потоки я все-таки использую наверно для вывода в Excel.
y-soft
спасибо за ссылку, щас гляну, если найду там чо-либо на тему коннекта и экспорта, будет замечательно


 
garry79 ©   (2004-04-19 08:03) [15]

Все-таки сделал в основном потоке, благодаря ProcessMesages. Единственное, хочу что-то вроде своего метода Create(AOwner,<свой параметр>) сделать, чтоб на вызов заставки в основной форме (у меня несколько вариантов заставок на одной форме) уходила одна строчка, а не несколько, со всякой инициализацией...
Пробовал CreateNew, и параметр Dummy использовать, но он блин сбивает все настройки формы изначальные...


 
sniknik ©   (2004-04-19 08:17) [16]

procedure TSplashTread.Execute;
begin
//создаем форму
Synchronize(CrForm);
end;

вот это сводит смысл потока на нет, с тем же успехом просто в основно сделал бы.
лутше вынеси вычисления в поток а не форму.


 
ЮЮ ©   (2004-04-19 08:23) [17]

>хочу что-то вроде своего метода Create(AOwner,<свой параметр>) сделать

И кто мешает? Тип и параметры менять не стал, но принцип, думаю, понятен:

TfrmDocument = class(TForm)
...
 constructor
   Create(AReadOnly: boolean; AOwner: TComponent; Id, DocumentType: integer);
   reintroduce;
...
end;

constructor TfrmDocument.Create(
 AReadOnly: boolean; AOwner: TComponent; Id, DocumentType: integer
);
begin
 inherited Create(AOwner);
 ...
end;


 
KSergey ©   (2004-04-19 08:27) [18]

Потоки.. потоки...

Надеюсь, никто не будет спорить, что MS Word или IDE Delphi - программы, выплненные на высочайшем профессиональном уровне.

так вот: кто-нибудь видел, чтобы у них заставки прям уж отлично отрисовывались?? Никто, а значит - нефиг выпендриваться! Лучше еще раз посмотреть организацтю основного кода - за это скорее пользователи спасибо скажут.

Надо обновлять метку - TControl.Repaint
Все окно не обновляется при переключении туда-сюда (между прогами) - ну и фиг с ним! Нефиг переключаться!
Таково мое твердое мнение.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.05.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.031 c
3-1080955812
olhovik
2004-04-03 05:30
2004.05.02
Добавление в Базу данных


3-1081136342
Марат
2004-04-05 07:39
2004.05.02
Формат ячейки в DBGrid


11-1066589744
Alchemist
2003-10-19 22:55
2004.05.02
Закачка файлов KOLHttp


1-1081873908
AsD
2004-04-13 20:31
2004.05.02
BPL и формы


14-1081833297
Vlad Oshin
2004-04-13 09:14
2004.05.02
Не поможите найти драйвер для AIC7895p(SCSI) под Win2000?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский