Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.09;
Скачать: CL | DM;

Вниз

SQL-запрос в потоке TThread   Найти похожие ветки 

 
User_OKA ©   (2002-11-21 15:00) [0]

Делаю SQL-запрос (подсчет кол-ва записей таблицы MyTable и вывод результата в MainForm.StatusBar) в потоке:

unit Thread_RecordCount;

interface

uses Classes, pFIBDataSet, db, SysUtils, Forms, Dialogs, comctrls;

type
TThread_RecordCount = class(TThread)
private
{ Private declarations }
procedure pForm_RecordCount;
protected
procedure Execute; override;
end;

implementation

uses MainUnit, DMUnit;

procedure TThread_RecordCount.pForm_RecordCount;
begin
with MainForm do
TStatusBar(FindComponent("StatusBar")).Panels[3].Text:=DM.FIBQuery.Fields[0].AsString;
end;

procedure TThread_RecordCount.Execute;
begin
try
with DM.FIBTransaction do
if not InTransaction then StartTransaction;
with DM.FIBQuery do
begin
Close;
SQL.Clear;
SQL.Add("SELECT count(*) FROM MyTable");
ExecQuery;
end;
Synchronize(pForm_RecordCount);
except
with DM.FIBTransaction do
if InTransaction then Rollback;
MessageDlg("Ошибка при подсчете количества записей!", mtError, [mbOk], 0);
Exit;
end;
end;

end.

Поток вызываю в MainForm:

try
iThread_RecordCount:=TThread_RecordCount.Create(true);
with iThread_RecordCount do begin
Resume;
Priority:=tpLowest;
end;
finally
with iThread_RecordCount do begin
Terminate;
Free;
end;
end;

И всё бы хорошо, но если внутри Execute происходит исключение (сеть накрылась или таблица не обнаружена или ещё что-нибудь), сообщение об ошибке выводится один раз, а при повторной ошибке выводится сообщение и приложение виснет намертво.

Вопрос в следующем: как корректно отловить и обработать исключение в потоке?

Буду благодарен за любые ссылки и комментарии!


 
sniknik ©   (2002-11-21 15:15) [1]

стандарт
try
except
end;
для потока работает.
на всякий случай в начало процедуры Execute;
поставь
CoInitialize(nil);
в конец
CoUnInitialize();

и поройся в кладовке видел там простой пример работы с базой в потоке. по моему так и называется TreadBase.


 
sniknik ©   (2002-11-21 15:17) [2]

кстати
MessageDlg("Ошибка при подсчете количества записей!", mtError, [mbOk], 0);
так нельзя (визуальный компонент вызывается) надо через Synchronize(SendMsg);
SendMsg - твоя функция в ней MessageDlg....


 
User_OKA ©   (2002-11-21 15:23) [3]

to sniknik ©
Спасибо, попробую!



Страницы: 1 вся ветка

Текущий архив: 2002.12.09;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.013 c
3-27848
Dimedrol
2002-11-20 15:47
2002.12.09
FormatDateTime в DBGrid-е ?


1-28060
DDF
2002-11-26 07:02
2002.12.09
Подскажите что делаю не так?


14-28287
Юрий К
2002-11-18 23:15
2002.12.09
---|Ветка была без названия|---


1-28081
nick_vstu
2002-11-28 09:45
2002.12.09
Управление Винампом


1-27910
macrohead
2002-11-27 15:07
2002.12.09
base64