Главная страница
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
1-28020
Checist [root]
2002-11-30 03:06
2002.12.09
Несколько элементов одного типа (ОЧЕНЬ НУЖНА ПОМОЩЬ)


3-27840
cutter-pro
2002-11-20 17:40
2002.12.09
Каскадное удаление в Paradox


3-27834
NeyroSpace
2002-11-20 16:12
2002.12.09
Кто-нибудь обьясните как работает IBUpdateSQL?


6-28160
neodiX
2002-10-07 14:12
2002.12.09
Как послать SYN-ACK пакет?


1-27980
Илайдж
2002-11-29 15:03
2002.12.09
Работа с Excel без левых компонент.