Текущий архив: 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.44 MB
Время: 0.009 c