Форум: "Основная";
Текущий архив: 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.034 c