Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.45 MB
Время: 0.012 c
14-28212
Александр Павлов
2002-11-17 05:59
2002.12.09
FindFirst( Украина Донецк Гуру.MAN ,faНеРедиска, Delphi + Beer );


8-28152
Soft
2002-08-19 21:45
2002.12.09
Каким образом можно преобразовать данные с TIcon в TBitmap ?


3-27804
Andrew2
2002-11-21 05:31
2002.12.09
Как скопировать данные с одного сервера БД на другой ?


4-28332
Renat
2002-10-23 16:55
2002.12.09
С помощью какой API - функции можно вызвать из моей программы..


14-28291
Jeer
2002-11-18 23:10
2002.12.09
Програмитсты -кто они ?




   Наверх