Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.02;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.029 c
3-1081252282
Лысый
2004-04-06 15:51
2004.05.02
Проблема с запросом


3-1080830024
White
2004-04-01 18:33
2004.05.02
Запущен ли InterBase Server?


1-1081916561
Марат
2004-04-14 08:22
2004.05.02
Формат времени


3-1081343562
wild_arg
2004-04-07 17:12
2004.05.02
Удаление записей из dbf


3-1080809826
Draught
2004-04-01 12:57
2004.05.02
передача запроса SQL серверу