Главная страница
    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.44 MB
Время: 0.009 c
14-28206
Праведник
2002-11-15 22:34
2002.12.09
Звук в Делфи


1-28128
ProNixp
2002-11-28 17:46
2002.12.09
Файл списков


14-28254
Ketmar
2002-11-16 20:35
2002.12.09
я сильный....


4-28346
Alexander
2002-10-26 11:56
2002.12.09
Как можно узнать путь к папке Program Files на удалённом


3-27827
sers
2002-11-20 10:29
2002.12.09
Вопрос по FastReport





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский