Вниз
Скачать: 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.015 c
1-28111
Jurden
2002-11-28 14:36
2002.12.09
Microsoft Excel


3-27870
Explorer
2002-11-15 11:25
2002.12.09
StoredProc


14-28276
esv
2002-11-17 19:13
2002.12.09
TinyDB v2.9


1-28124
Ser_Kham1
2002-11-28 14:53
2002.12.09
Crypto


4-28358
sender
2002-10-28 19:06
2002.12.09
Буфер ввода/вывода




   Наверх