MyTable.Open;
while not MyTable.Eof do begin
ProgressBar.Position:=ProgressBar.Position+10;
DM.qMain.Next;
end;
Но не понимаю если кидать его на отдельную форму и показывать её,то она просто постоянно висит.Попытался через потоки реализавать тоже кривовато выходит.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re: При долгой загрузке данных показать форму с програссбаро
В коде возможно ошибка:
открываем MyTable, а движемся по другому dataset'у
Если не ошибка, то смотрим дальше.
L>Но не понимаю если кидать его на отдельную форму и показывать её,то она просто постоянно висит.Попытался через потоки реализавать тоже кривовато выходит.
L> MyTable.Open;
L> while not MyTable.Eof do begin
L> ProgressBar.Position:=ProgressBar.Position+10;
Application.ProcessMessages;
L> DM.qMain.Next;
L> end;
L>
Только не совсем понятно, что занчит "загрузка данных".
Раз вызывается MyTable.Open, то данные уже загружены.
... << RSDN@Home 1.1.4 beta 4 rev. 302>>
Re[2]: При долгой загрузке данных показать форму с програссб
Hello, Softwarer!
You wrote on Wed, 27 Apr 2005 07:45:01 GMT:
S> Аналоги TTable имеют полное право быть грамотно реализованными В S> частности, если не ошибаюсь, был абсолютно нормально сделанный аналог S> для Interbase.
По-моему они все нормально реализованы...
На Open выполняется SQL-запрос а на Next получает данные с сервера (fetch).
Со стандартным TTable (BDE) я сомневаюсь, что читается весь файл от и до на Open. Т.к. не вижу причин для этого кроме определения кол-ва записей.
With best regards, Alexander Diouzshev-Maltsev.
Posted via RSDN NNTP Server 1.9
Re[6]: При долгой загрузке данных показать форму с програссб
Здравствуйте, Diouzshev, Вы писали:
D>Hello, Softwarer! D>You wrote on Wed, 27 Apr 2005 07:45:01 GMT:
S>> Аналоги TTable имеют полное право быть грамотно реализованными В S>> частности, если не ошибаюсь, был абсолютно нормально сделанный аналог S>> для Interbase.
D>По-моему они все нормально реализованы... D>На Open выполняется SQL-запрос а на Next получает данные с сервера (fetch). D>Со стандартным TTable (BDE) я сомневаюсь, что читается весь файл от и до на Open. Т.к. не вижу причин для этого кроме определения кол-ва записей.
Блин я конечно извиняюсь что написал Table,у меня Query но пока проблема никак не решилась.
D>With best regards, Alexander Diouzshev-Maltsev.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[7]: При долгой загрузке данных показать форму с програссб
Здравствуйте, Diouzshev, Вы писали:
D>Со стандартным TTable (BDE) я сомневаюсь, что читается весь файл от и до на Open. Т.к. не вижу причин для этого кроме определения кол-ва записей.
Признаю что погорячился. Любой датасет, по идее, читает данные в свой внутренний буфер по мере необходимости.
... << RSDN@Home 1.1.4 beta 4 rev. 302>>
Re[8]: При долгой загрузке данных показать форму с програссб
Здравствуйте, kavlad, Вы писали:
K>Здравствуйте, linker, Вы писали:
L>>но пока проблема никак не решилась.
K>Я же тебе код написал, который решит твою проблему K>Посмотри повнимательнее.
Извиняюсь не внимательно посомтрел.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[8]: При долгой загрузке данных показать форму с програссб
Здравствуйте, kavlad, Вы писали:
K>Здравствуйте, linker, Вы писали:
L>>но пока проблема никак не решилась.
K>Я же тебе код написал, который решит твою проблему K>Посмотри повнимательнее.
Все равно в начале Open потом пауза, а потом progress заполняется очень быстро(почти сразу).
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[9]: При долгой загрузке данных показать форму с програссб
Здравствуйте, linker, Вы писали:
L>Здравствуйте, kavlad, Вы писали:
K>>Здравствуйте, linker, Вы писали:
L>>>но пока проблема никак не решилась.
K>>Я же тебе код написал, который решит твою проблему K>>Посмотри повнимательнее.
L>Все равно в начале Open потом пауза, а потом progress заполняется очень быстро(почти сразу).
Так оно и будет...
Ты бы сначала сказал какой датасет используеш? BDE, ADO, что то другое.
Я для этой цели использовал поток который сорздавал форму и имел свой обработчик событий. Тогда подвисает только приложение, а ProgressWindow висит себе как нивчем небывало, кручу себе там прогрессик или говорю "Подождите пожалуйста". Сразу предупрежу если захочеш такое реализовать не используй TForm — ничего не выйдет. TForm синхронизируется с главным окном приложения через SendMessage (висит короче все).
Да и не приводите контр выпады с Application.ProcessMessage — это полный Unsafe и в некоторых случаях совсем неприменим.
Привожу базовые классы, если интересно, конечно. На идеальность не претендует но идею подхватить можна...
type
TWindowThread = class(TThread)
private
function ProcessMessage(var Msg: TMsg): Boolean;
protected
procedure Execute; override;
procedure CreateWindow; virtual; abstract;
procedure DestroyWindow; virtual; abstract;
procedure Idle; virtual;
public
procedure ProcessMessages;
end;
TThreadForm = class(TWinControl)
private
FIcon: TIcon;
procedure SetIcon(Value: TIcon);
function IsIconStored: Boolean;
function GetIconHandle: HICON;
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
protected
procedure CreateParams(var Params: TCreateParams); override;
public
constructor Create(AOwner : TComponent); override;
destructor Destroy; override;
procedure CreateWnd; override;
property Icon: TIcon read FIcon write SetIcon stored IsIconStored;
end;
implementation
procedure TWindowThread.Execute;
begin
CreateWindow;
try
repeat
ProcessMessages;
until Terminated;
finally
DestroyWindow;
end;
end;
function TWindowThread.ProcessMessage(var Msg: TMsg): Boolean;
begin
Result := False;
if PeekMessage(Msg, 0, 0, 0, PM_NOREMOVE) then
begin
if GetMessage (Msg, 0, 0, 0) then begin
Result := True;
if Msg.Message <> WM_QUIT then begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end else
Terminate;
end;
end else
WaitMessage;
Idle;
end;
procedure TWindowThread.Idle;
begin{ что то себе делай }end;
procedure TWindowThread.ProcessMessages;
var
Msg: TMsg;
begin
while not Terminated and ProcessMessage (Msg) do{loop};
end;
constructor TThreadForm.Create(AOwner: TComponent);
begin
inherited;
FIcon := TIcon.Create;
FIcon.Width := GetSystemMetrics(SM_CXSMICON);
FIcon.Height := GetSystemMetrics(SM_CYSMICON);
end;
destructor TThreadForm.Destroy;
begin
FIcon.Free;
inherited;
end;
procedure TThreadForm.CreateParams(var Params: TCreateParams);
begin
inherited;
with Params.WindowClass do
Style := Style and not (CS_HREDRAW or CS_VREDRAW);
Params.WndParent := 0;
Params.Style := Params.Style and not (WS_CHILD or WS_GROUP or WS_TABSTOP);
Params.Style := Params.Style or (WS_CAPTION or WS_BORDER);
Params.WindowClass.lpfnWndProc := @DefWindowProc;
with Params do
Style := Style or WS_SYSMENU;
Params.WindowClass.hIcon := GetIconHandle;
end;
procedure TThreadForm.CreateWnd;
begin
inherited CreateWnd;
SendMessage(Handle, WM_SETICON, 1, GetIconHandle);
end;
function TThreadForm.GetIconHandle: HICON;
begin
Result := FIcon.Handle;
if Result = 0 then Result := Application.Icon.Handle;
end;
function TThreadForm.IsIconStored: Boolean;
begin
Result := Icon.Handle <> 0;
end;
procedure TThreadForm.SetIcon(Value: TIcon);
begin
FIcon.Assign(Value);
end;
procedure TThreadForm.WMPaint(var Message: TWMPaint);
var
DC: HDC;
PS: TPaintStruct;
begin
inherited;
if not IsIconic(Handle) then
begin
ControlState := ControlState + [csCustomPaint];
inherited;
ControlState := ControlState - [csCustomPaint];
end
else
begin
DC := BeginPaint(Handle, PS);
DrawIcon(DC, 0, 0, GetIconHandle);
EndPaint(Handle, PS);
end;
end;
Re[10]: При долгой загрузке данных показать форму с програсс
Да кстати как узнать что у тебя программа подвисла (чем то занят главный поток) из дочернего потока:
if SendMessageTimeout (Application.Handle, WM_GETTEXTLENGTH, 0, 0, SMTO_ABORTIFHUNG, Interval, Result) <> 0 then{ все нормально, основной поток живет, запомнить текущее время }else{ Главный поток не отвечает. Проверить давненко ли это было. Показать форму с прогрессом если нужно }
Re[10]: При долгой загрузке данных показать форму с програсс
Здравствуйте, Danchik, Вы писали:
D>Здравствуйте, linker, Вы писали:
L>>Здравствуйте, kavlad, Вы писали:
K>>>Здравствуйте, linker, Вы писали:
L>>>>но пока проблема никак не решилась.
K>>>Я же тебе код написал, который решит твою проблему K>>>Посмотри повнимательнее.
L>>Все равно в начале Open потом пауза, а потом progress заполняется очень быстро(почти сразу). D>Так оно и будет...
D>Ты бы сначала сказал какой датасет используеш? BDE, ADO, что то другое.
Пользуюсь Zeos(MySql)
D>Я для этой цели использовал поток который сорздавал форму и имел свой обработчик событий. Тогда подвисает только приложение, а ProgressWindow висит себе как нивчем небывало, кручу себе там прогрессик или говорю "Подождите пожалуйста". Сразу предупрежу если захочеш такое реализовать не используй TForm — ничего не выйдет. TForm синхронизируется с главным окном приложения через SendMessage (висит короче все).
Я тоже пробовал ыорму в отдельном потоке, но пока до конца не доделал.А с TForm у меня получилось(хоть и криво, но как вариант жить можно),но хочется все таки по человечески потому копаю дальше.За классы спасибо,интересно.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[11]: При долгой загрузке данных показать форму с програсс
L>Я тоже пробовал ыорму в отдельном потоке, но пока до конца не доделал.А с TForm у меня получилось(хоть и криво, но как вариант жить можно),но хочется все таки по человечески потому копаю дальше.За классы спасибо,интересно.
Слабо верится что TForm нормально работает в потоке (долго я это борол). Я создаю TThreadWindow наследник и ручками Run-Time сам накидываю туда контролы (кнопочка и прогрессик)- работы почти ничего. Только помни что создавать окно нужно в потоке. CreateWindow метод — подходящее место.
А вот классы что я выложил — это то до чего я дошел что бы все таки все крутилось — полный минимум, так сказать.
Re: При долгой загрузке данных показать форму с програссбаро
Здравствуйте, linker, Вы писали:
L>Как правильно сделать?Пробовал вот так: L>
L> MyTable.Open;
L> while not MyTable.Eof do begin
L> ProgressBar.Position:=ProgressBar.Position+10;
L> DM.qMain.Next;
L> end;
L>
L>Но не понимаю если кидать его на отдельную форму и показывать её,то она просто постоянно висит.Попытался через потоки реализавать тоже кривовато выходит.
Вот тебе самое простое и рабочее решение
MyTable.Open;
while not MyTable.Eof do begin
ProgressBar.Position:=ProgressBar.Position+10;
>>Application.ProcessMessages;<< вот это воткни в цикл и будет тебе счастье :)
DM.qMain.Next;
end;
Re[2]: При долгой загрузке данных показать форму с програссб
Здравствуйте, white-mrak, Вы писали:
WM>Здравствуйте, linker, Вы писали:
L>>Как правильно сделать?Пробовал вот так: L>>
L>> MyTable.Open;
L>> while not MyTable.Eof do begin
L>> ProgressBar.Position:=ProgressBar.Position+10;
L>> DM.qMain.Next;
L>> end;
L>>
L>>Но не понимаю если кидать его на отдельную форму и показывать её,то она просто постоянно висит.Попытался через потоки реализавать тоже кривовато выходит.
WM>Вот тебе самое простое и рабочее решение
WM>
WM> MyTable.Open;
WM> while not MyTable.Eof do begin
WM> ProgressBar.Position:=ProgressBar.Position+10;
>>>Application.ProcessMessages;<< вот это воткни в цикл и будет тебе счастье :)
WM> DM.qMain.Next;
WM> end;
WM>
Вот это воткнул, но полного счастья не обрел
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[10]: При долгой загрузке данных показать форму с програсс