![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Выполнение запросов в потоке, с использованием DOA
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 в студию.