При долгой загрузке данных показать форму с програссбаром.
От: linker Россия  
Дата: 27.04.05 06:43
Оценка:
Как правильно сделать?Пробовал вот так:
     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: При долгой загрузке данных показать форму с програссбаро
От: kavlad Россия http://www.wavesoft.ru
Дата: 27.04.05 06:49
Оценка:
Здравствуйте, linker, Вы писали:

В коде возможно ошибка:
открываем MyTable, а движемся по другому dataset'у

Если не ошибка, то смотрим дальше.

L>Но не понимаю если кидать его на отдельную форму и показывать её,то она просто постоянно висит.Попытался через потоки реализавать тоже кривовато выходит.


Re: Нужен компонент TpogressBar который работал бы в потоке
Автор: crackoff
Дата: 27.04.05


L>Как правильно сделать?Пробовал вот так:

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]: При долгой загрузке данных показать форму с програссб
От: linker Россия  
Дата: 27.04.05 06:56
Оценка:
Здравствуйте, kavlad, Вы писали:

K>Здравствуйте, linker, Вы писали:


K>В коде возможно ошибка:

K>открываем MyTable, а движемся по другому dataset'у

Да описался,с проекта выдрал и не все поменял на Mytable;
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[2]: При долгой загрузке данных показать форму с програссб
От: Softwarer http://softwarer.ru
Дата: 27.04.05 07:02
Оценка:
Здравствуйте, kavlad, Вы писали:

K>Раз вызывается MyTable.Open, то данные уже загружены.


Отнюдь не обязательно, вообще говоря

http://sql.ru/forum/actualthread.aspx?bid=20&amp;tid=174320&amp;pg=2#1452825
http://sql.ru/forum/actualthread.aspx?bid=20&amp;tid=174320&amp;pg=2#1453413
Re[3]: При долгой загрузке данных показать форму с програссб
От: kavlad Россия http://www.wavesoft.ru
Дата: 27.04.05 07:20
Оценка:
Здравствуйте, Softwarer, Вы писали:

S>Отнюдь не обязательно, вообще говоря


S>http://sql.ru/forum/actualthread.aspx?bid=20&amp;tid=174320&amp;pg=2#1452825

S>http://sql.ru/forum/actualthread.aspx?bid=20&amp;tid=174320&amp;pg=2#1453413

В коде написано MyTable — я подумал, что используется TTable или его аналоги.
В ссылках используют TQuery.
... << RSDN@Home 1.1.4 beta 4 rev. 302>>
Re[4]: При долгой загрузке данных показать форму с програссб
От: Softwarer http://softwarer.ru
Дата: 27.04.05 07:45
Оценка:
Здравствуйте, kavlad, Вы писали:

K>В коде написано MyTable — я подумал, что используется TTable или его аналоги.


Аналоги TTable имеют полное право быть грамотно реализованными В частности, если не ошибаюсь, был абсолютно нормально сделанный аналог для Interbase.
Re[5]: При долгой загрузке данных показать форму с програссб
От: Diouzshev Россия  
Дата: 27.04.05 07:55
Оценка:
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]: При долгой загрузке данных показать форму с програссб
От: linker Россия  
Дата: 27.04.05 08:02
Оценка:
Здравствуйте, 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]: При долгой загрузке данных показать форму с програссб
От: kavlad Россия http://www.wavesoft.ru
Дата: 27.04.05 08:14
Оценка:
Здравствуйте, linker, Вы писали:

L>но пока проблема никак не решилась.


Я же тебе код написал, который решит твою проблему
Посмотри повнимательнее.
... << RSDN@Home 1.1.4 beta 4 rev. 302>>
Re[5]: При долгой загрузке данных показать форму с програссб
От: kavlad Россия http://www.wavesoft.ru
Дата: 27.04.05 08:14
Оценка:
Здравствуйте, Softwarer, Вы писали:

S>В частности, если не ошибаюсь, был абсолютно нормально сделанный аналог для Interbase.


Нда. Беру свои слова обратно. Посмотрел код — действительно грамотно реализовано
... << RSDN@Home 1.1.4 beta 4 rev. 302>>
Re[6]: При долгой загрузке данных показать форму с програссб
От: kavlad Россия http://www.wavesoft.ru
Дата: 27.04.05 08:14
Оценка:
Здравствуйте, Diouzshev, Вы писали:

D>Со стандартным TTable (BDE) я сомневаюсь, что читается весь файл от и до на Open. Т.к. не вижу причин для этого кроме определения кол-ва записей.


Признаю что погорячился. Любой датасет, по идее, читает данные в свой внутренний буфер по мере необходимости.
... << RSDN@Home 1.1.4 beta 4 rev. 302>>
Re[8]: При долгой загрузке данных показать форму с програссб
От: linker Россия  
Дата: 27.04.05 08:26
Оценка:
Здравствуйте, kavlad, Вы писали:

K>Здравствуйте, linker, Вы писали:


L>>но пока проблема никак не решилась.


K>Я же тебе код написал, который решит твою проблему

K>Посмотри повнимательнее.

Извиняюсь не внимательно посомтрел.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[8]: При долгой загрузке данных показать форму с програссб
От: linker Россия  
Дата: 27.04.05 09:04
Оценка:
Здравствуйте, kavlad, Вы писали:

K>Здравствуйте, linker, Вы писали:


L>>но пока проблема никак не решилась.


K>Я же тебе код написал, который решит твою проблему

K>Посмотри повнимательнее.

Все равно в начале Open потом пауза, а потом progress заполняется очень быстро(почти сразу).
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[9]: При долгой загрузке данных показать форму с програссб
От: Danchik Украина  
Дата: 27.04.05 09:47
Оценка: 5 (2)
Здравствуйте, 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]: При долгой загрузке данных показать форму с програсс
От: Danchik Украина  
Дата: 27.04.05 10:05
Оценка: 2 (2)
Да кстати как узнать что у тебя программа подвисла (чем то занят главный поток) из дочернего потока:

  if SendMessageTimeout (Application.Handle, WM_GETTEXTLENGTH, 0, 0, SMTO_ABORTIFHUNG, Interval, Result) <> 0 then 
    { все нормально, основной поток живет, запомнить текущее время }
  else
    { Главный поток не отвечает. Проверить давненко ли это было. Показать форму с прогрессом если нужно }
Re[10]: При долгой загрузке данных показать форму с програсс
От: linker Россия  
Дата: 27.04.05 10:08
Оценка:
Здравствуйте, 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]: При долгой загрузке данных показать форму с програсс
От: Danchik Украина  
Дата: 27.04.05 10:24
Оценка:
L>Я тоже пробовал ыорму в отдельном потоке, но пока до конца не доделал.А с TForm у меня получилось(хоть и криво, но как вариант жить можно),но хочется все таки по человечески потому копаю дальше.За классы спасибо,интересно.

Слабо верится что TForm нормально работает в потоке (долго я это борол). Я создаю TThreadWindow наследник и ручками Run-Time сам накидываю туда контролы (кнопочка и прогрессик)- работы почти ничего. Только помни что создавать окно нужно в потоке. CreateWindow метод — подходящее место.

А вот классы что я выложил — это то до чего я дошел что бы все таки все крутилось — полный минимум, так сказать.
Re: При долгой загрузке данных показать форму с програссбаро
От: white-mrak Россия  
Дата: 27.04.05 14:47
Оценка:
Здравствуйте, 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]: При долгой загрузке данных показать форму с програссб
От: linker Россия  
Дата: 27.04.05 14:53
Оценка:
Здравствуйте, 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]: При долгой загрузке данных показать форму с програсс
От: alive Россия  
Дата: 08.04.09 11:22
Оценка:
Здравствуйте, Danchik, Вы писали:


D>Привожу базовые классы, если интересно, конечно. На идеальность не претендует но идею подхватить можна...


Прошу прощения, что поднимаю тему четырехлетней давности. Danchik ты не мог бы привести работающий пример использования этого кода. Что то туплю я
...<< RSDN@Home 1.2.0 alpha 4 rev. 1125>>
...Foobar {fb2k: Aerosmith — Walk On Down}
Keep yourself alive
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.