Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Выполнение запросов в потоке, с использованием DOA


Страницы:   1 2 3

nobody ©   (2010-06-21 16:13:00) 

Вопрос к знатокам:
Почему при выполнении запроса в потоке залипает интерфейс всего приложения, вместо того, чтобы реагировать на действия пользователя во время выполнения запроса?

реализовано в коде следующим образом:

type

 TThreadControl = class(TThread)
 private
   FOracleDataSet: TOracleDataSet;
   FOracleQuery: TOracleQuery;
   FControl_C: TControl;
   FControl_A: TAction;
   FGrid: TcxGridDBTableView;
   FForm: TForm;
   FCollapse: boolean;
   FProcessMonitor: TProcessMonitor;
 protected
   FErrorMsg: string;
   procedure Execute; override;
   procedure LockControl;
   procedure UnLockControl;
   procedure ShowErrorMsg;
 public
   constructor Create(CreateSuspended: Boolean; OracleDataSet: TOracleDataSet;
     ProcessMonitor: TProcessMonitor; Control: TControl; Grid: TcxGridDBTableView; Form: TForm; FCollapse: boolean;
     LockControl: boolean = true);
     overload;
   constructor Create(CreateSuspended: Boolean; OracleQuery: TOracleQuery;
     ProcessMonitor: TProcessMonitor; Control: TControl; Grid: TcxGridDBTableView; Form: TForm; FCollapse: boolean;
     LockControl: boolean = true);
     overload;
   constructor Create(CreateSuspended: Boolean; OracleDataSet: TOracleDataSet;
     ProcessMonitor: TProcessMonitor; Control: TAction; Grid: TcxGridDBTableView; Form: TForm; FCollapse: boolean;
     LockControl: boolean = true);
     overload;
 end;

...

procedure TThreadControl.Execute;
begin
 inherited;
 try
   Synchronize(LockControl);
   if FOracleQuery <> nil then
     FOracleQuery.Execute;
   if FOracleDataSet <> nil then
   begin
     try
       FOracleDataSet.Close;
       FOracleDataSet.Open;
     except
       on E: Exception do
        begin
         FErrorMsg := E.Message;
         Synchronize(ShowErrorMsg);
        end;
     end;
   end;
 finally
   Synchronize(UnLockControl);
 end;
end;

MDI-приложение, дочерние формы загружаются из bpl-модулей.
В каждом модуле есть своя сессия, которая активизируется при необходимости выполнения запроса от этой формы.
Сессия отключается по истечению тайм-аута.
Если нужна еще какая-нить инфа, спрашивайте.


nobody   (2010-06-21 16:30:00) [41]


> Только за передачу OracleDataSet в нить я-б руки оторвал.
>  По самое нехочу.

звучит сурово
а можно глянуть на Вашу реализацию многопоточности в коде, или хотя бы в двух словах, как лучше реализовать?


nobody   (2010-06-21 16:29:00) [42]

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


Ega23   (2010-06-21 16:28:00) [43]

Только за передачу OracleDataSet в нить я-б руки оторвал. По самое нехочу.


nobody   (2010-06-21 16:26:00) [44]


> Какой-то лютый капец.

согласен, это все нужно выбросить. но пока есть только такое


nobody   (2010-06-21 16:25:00) [45]


> Так что рекомендую через memtable SQL выполнять.

а можно про это попдробней? что это за компонент? tdxMemData подойдет?


Ega23   (2010-06-21 16:24:00) [46]

Какой-то лютый капец.


nobody   (2010-06-21 16:22:00) [47]


> Код LockControl и UnlockControl в студию.

procedure TThreadControl.LockControl;
begin
 FOracleDataSet.DisableControls;

 if Assigned(FControl_C) then
   FControl_C.Enabled := false;
 if Assigned(FControl_A) then
   FControl_A.Enabled := false;
 if Assigned(FGrid) then
   FGrid.BeginUpdate;
 if Assigned(FForm) then
   FForm.Enabled := false;
end;

procedure TThreadControl.UnLockControl;
begin

 FOracleDataSet.EnableControls;
 if Assigned(FControl_C) then
   FControl_C.Enabled := true;
 if Assigned(FControl_A) then
   FControl_A.Enabled := true;
 if Assigned(FGrid) then
 begin
   FGrid.EndUpdate;
   if FCollapse then
     FGrid.ViewData.Collapse(true)
   else
     FGrid.ViewData.Expand(true);
 end;
 if Assigned(FForm) then
   FForm.Enabled := true;

 FProcessMonitor.DelThread(Self.Handle, false);
end;


tesseract   (2010-06-21 16:22:00) [48]


> Почему при выполнении запроса в потоке залипает интерфейс
> всего приложения, вместо того, чтобы реагировать на действия
> пользователя во время выполнения запроса?


Читаем про Synchronize. Он по любому будет выполнятся в контексте основного приложения. Так что рекомендую через memtable SQL выполнять.


Ega23   (2010-06-21 16:16:00) [49]

Код LockControl и UnlockControl в студию.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо