powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не срабатывает отключение от базы пока не закрыта форма.
25 сообщений из 99, страница 3 из 4
Не срабатывает отключение от базы пока не закрыта форма.
    #39497976
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, попробуй вместо
Код: pascal
1.
db3:=TpFIBDatabase.Create(nil);


сделать
Код: pascal
1.
db3:=TpFIBDatabase.Create(Self);



Понятно, что танец с бубном, но все же...
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39498024
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemarпотом эксепшен Format '%s' invalid or incompatible with argument и всё. Что могло не форматироваться в строку?GallemarНу и сам код:
Код: pascal
1.
2.
3.
...
AddLog(Format(rsSS, [MyThread, rsStart]));
...//wadman[/color]



И что бы там могло не форматироваться в строку, действительно?.. :)
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39498069
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДGallemar,

ну раз локальный коннект у тебя - то попробуй вызывать в конце fb_shutdown().
На 2.5 мне помогало.
А как это сделать правильно? Получаю AV, у тебя как понимаю такая же проблема была, как решил?
http://www.sql.ru/forum/1140365/kak-akkurutno-vyzvat-fb-shutdown
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39498071
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockОн=деструктор. Во всяком случае, в IBX так.
пробовал,не помогает, ни try ... expert c проверкой исключений на ib3.connected:=False; ib3.Close; ib3.Free;, ни free после finally.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39498075
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,переписал, но пока работу с БД оставил как оно было у меня. Вот проект https://yadi.sk/d/lVonvmME3Lbfxb, проблема в том, что теперь вообще коннект к базе не проходит.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39498079
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,переписал своё в таком виде:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,inifiles, FIBQuery, pFIBQuery,FIBDatabase,  pFIBDatabase,
  ExtCtrls, tlhelp32, XPMan , wcthread, wlog ;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Timer1: TTimer;
    Button2: TButton;
    XPManifest1: TXPManifest;
    WCThread1: TWCThread;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }

  public
    { Public declarations }
  end;

      TMyThread = class(TThread)
    	private
        		Fpath1, Fpath2,Fkind,Flog,Fexe,Fuser: string;
        		db3 :   TpFIBDatabase;
        		trans3 : TpFIBTransaction;
        		query3:   TpFIBQuery;
      protected
        		procedure CreateConnection;
        		procedure CloseConnection;
    	public
        		constructor Create(CreateSuspended: Boolean; var Apath1, Apath2, Akind,Alog,Aexe,Auser : string);
        		destructor Destroy; override;
        		procedure Execute; override;
    	end;


var
    Form1: TForm1;



implementation

{$R *.dfm}

procedure TMyThread.CreateConnection;

begin
    // подключаемся, настраиваем транзакцию и т.п
    // логируем через wlog
     PostToLog('Create connection');
     db3:=TpFIBDatabase.Create(nil);
     trans3:= TpFIBTransaction.Create(nil);
     query3:= TpFIBQuery.Create(nil);
     db3.connectparams.Username:='SYSDBA';
     db3.connectparams.Password:='masterkey';
     db3.DatabaseName:='d:\fdbase\fb_log_database.fdb';
     db3.AutoReconnect := False;
     db3.DefaultUpdateTransaction:=trans3;
     db3.LibraryName:= 'fbclient.dll';
     trans3.DefaultDatabase:=db3;
     query3.Database:=db3;
     query3.Transaction:=trans3;
     db3.connected:=True;
end;

procedure TMyThread.CloseConnection;
begin
    db3.connected:=False;
    db3.Close;
    PostToLog('Close connection');
end;

constructor TMyThread.Create(CreateSuspended: Boolean;  var Apath1, Apath2,Akind,Alog,Aexe,Auser: string);
begin
  	inherited Create(CreateSuspended);
  	CreateConnection;
  	Fpath1:= Apath1;
  	Fpath2:= Apath2;
  	Fkind:= Akind;
  	Flog:=Alog;
  	Fexe:=Aexe;
  	Fuser:=Auser;
end;

destructor TMyThread.Destroy;
begin
		CloseConnection;
    inherited Destroy;
end;

procedure TMyThread.Execute;
begin
    // делаем что нужно
					 	PostToLog(Format('%d Start execute', [Handle]));
            query3.SQL.Clear;
            query3.SQL.Add('insert into IMPORT_EXISTS_LOG (WRITE_TIME,KIND,USER_ID) values (current_timestamp,:KIND,:USER_ID)');
            trans3.StartTransaction;
         		query3.ParamByName('KIND').Value:= Fkind;
            query3.ParamByName('USER_ID').Value:= Fuser;
            query3.ExecQuery();
            trans3.Commit;
            query3.Close;
            freeandnil(trans3);
            freeandnil(query3);
            freeandnil(db3);
            CloseConnection;
            PostToLog(Format('%d End execute', [Handle]));
end;




procedure TForm1.Button1Click(Sender: TObject);
var
    i: integer;
    fini: TIniFile;
    sections: TStringList;
    tpath1
    ,tpath2
    ,tpath3
    , tkind
    , tlog
    , texe
    ,tuser: string;
    MyThread: TMyThread;
begin
    memo1.Lines.Clear;
    sections := TStringList.Create;
    try
      fini:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'init.ini');
      tpath3 := ExtractFilepath(Application.ExeName);
      fini.ReadSections(sections);
      //ïðîõîäèì ïî íàñòðîéêàì, ïîëó÷àåì ïóòè
      for i:= 0 to pred(sections.Count) do
      begin
        tpath1:=  fini.ReadString(sections[i],'source','');
        tpath2:=  fini.ReadString(sections[i],'target','');
        tkind:=  fini.ReadString(sections[i],'kind','');
        tlog:=  fini.ReadString(sections[i],'log','');
        texe:=  fini.ReadString(sections[i],'exe','');
        tuser:=  fini.ReadString(sections[i],'user','');
        memo1.Lines.Add(tpath1);
        memo1.Lines.Add(tpath2);
        memo1.Lines.Add(tkind);
         memo1.Lines.Add(tlog);
         memo1.Lines.Add(texe);
         memo1.Lines.Add(tuser);
        MyThread:= TMyThread.Create(true, tpath1,tpath2,tkind,tlog,texe,tuser);
      end;
    finally
      FreeAndNil(sections);
    end;
end;


end.



В логах:
01.08.2017 11:44:09.844 : Create connection
01.08.2017 11:44:10.339 : Create connection
01.08.2017 11:44:10.420 : Create connection
01.08.2017 11:44:10.500 : Create connection
01.08.2017 11:44:10.583 : Create connection
01.08.2017 11:44:10.668 : Create connection
01.08.2017 11:44:10.750 : Create connection
01.08.2017 11:44:10.852 : Create connection

01.08.2017 11:45:41.657 : Create connection
01.08.2017 11:45:42.121 : Create connection
01.08.2017 11:45:42.281 : Create connection
01.08.2017 11:45:42.474 : Create connection

как будто поток вообще не запускается
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39498100
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemarкак будто поток вообще не запускается
Флаг CreateSuspended означает, что поток создаётся приостановленным. Чтобы поток запустился, нужно вызвать у него Resume. Такое поведение нужно, чтобы проинициализировать поток после его создания. У вас же инициализация потока происходит в конструкторе. Поэтому можно в конструктор передавать флаг (CreateSuspended = false).
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39498104
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45, понял,спасибо.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39498105
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
теперь лог в таком виде:
01.08.2017 13:14:26.929 : Create connection
01.08.2017 13:14:27.167 : 648 Start execute
01.08.2017 13:16:38.978 : Create connection
01.08.2017 13:16:39.377 : 876 Start execute
01.08.2017 13:16:39.392 : Create connection
01.08.2017 13:16:39.461 : 1140 Start execute
01.08.2017 13:16:39.475 : Create connection
01.08.2017 13:16:39.548 : 1056 Start execute
01.08.2017 13:16:39.564 : Create connection
01.08.2017 13:16:39.634 : 1084 Start execute
01.08.2017 13:16:39.649 : Create connection
01.08.2017 13:16:39.717 : 1132 Start execute
01.08.2017 13:16:39.923 : Create connection
01.08.2017 13:16:39.995 : 1144 Start execute
01.08.2017 13:16:40.036 : Create connection
01.08.2017 13:16:40.104 : 1204 Start execute
01.08.2017 13:16:40.179 : Create connection
01.08.2017 13:16:40.247 : 1240 Start execute
01.08.2017 13:16:40.291 : Create connection
01.08.2017 13:16:40.361 : 1276 Start execute
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39498111
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док[
Gallemarа у меня в потоке формы не открываются, никакие.
я говорил про главную форму :)
Вот смотри (извини, схематично, потому что на коленке без D7)

Попробовал, не взлетело.
https://yadi.sk/d/CtNoFhK23LbkvQ
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39498114
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,
хм
пробовал try except для connected:=false и close - ничего не получил, а так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
procedure TMyThread.Execute;
begin
    // делаем что нужно
					 	PostToLog(Format('%d Start execute', [Handle]));
            query3.SQL.Clear;
            query3.SQL.Add('insert into IMPORT_EXISTS_LOG (WRITE_TIME,KIND,USER_ID) values (current_timestamp,:KIND,:USER_ID)');
            trans3.StartTransaction;
         		query3.ParamByName('KIND').Value:= Fkind;
            query3.ParamByName('USER_ID').Value:= Fuser;
            query3.ExecQuery();
            trans3.Commit;
            query3.Close;
            freeandnil(trans3);
            freeandnil(query3);
            freeandnil(db3);
            try
            CloseConnection;
            PostToLog(Format('%d End execute', [Handle]));
            except
            showmessage('проверка');
            end;
end;




получаю:
procedure TFIBDatabase.SetConnected(Value: Boolean);
begin
if csReading in ComponentState then
FStreamedConnected := Value
else
if Value then
begin
Open
end
else
Close;
end;

сейчас попробую фибовские ошибки поймать детальнее
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39498120
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

Сделайте так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
procedure TMyThread.Execute;
begin
  // делаем что нужно
  PostToLog(Format('%d Start execute', [Handle]));
  try
    query3.SQL.Clear;
    query3.SQL.Add('insert into IMPORT_EXISTS_LOG (WRITE_TIME,KIND,USER_ID) values (current_timestamp,:KIND,:USER_ID)');
    trans3.StartTransaction;
    try
      query3.ParamByName('KIND').Value:= Fkind;
      query3.ParamByName('USER_ID').Value:= Fuser;
      query3.ExecQuery();
      PostToLog(Format('%d End execute', [Handle]));
    finally
      trans3.Commit;
      freeandnil(trans3);
      freeandnil(query3);
      freeandnil(db3);
    end;
  except
    on e: exception do
      PostToLog(e.Message);
  end;
end;


Следите за тем, что если у вас объект уничтожается (freeandnil), то при последующем обращении к нему гарантированно получаете AV. Т.е. соединение может и уничтожилось (если до этого не вылетели из процедуры Execute), но потом должны выполниться эти строчки:
freeandnil(db3);
CloseConnection;
а в CloseConnection у вас идёт обращение к уже несуществующему объекту db3 и происходит Access violation. Так что до записи в лог даже не доходит.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39498140
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemarсейчас попробую фибовские ошибки поймать детальнее
Вынеси весь код из потока в отдельные процедуры: процедуру коннекта, процедуру дисконнекта, процедуру дергания запроса и основной цикл работы с файлами.
И проверь их работу в основном потоке, а уж когда отладишь - выноси в отдельный поток.
Не забывай про try except в операциях коннекта, дисконнекта, дергания запроса и работы с файлами.
В случае ошибок поток может тихо умирать и потому твои коннекты (99%) остаются висеть до закрытия приложения (до выгрузки dll).
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39498141
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
goldmi45, поправил

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
procedure TMyThread.CloseConnection;
begin
    db3.connected:=False;
    db3.Close;
    freeandnil(db3);
    PostToLog('Close connection');
end;

procedure TMyThread.Execute;
begin
    // делаем что нужно
				  PostToLog(Format('%d Start execute', [Handle]));
  try
    query3.SQL.Clear;
    query3.SQL.Add('insert into IMPORT_EXISTS_LOG (WRITE_TIME,KIND,USER_ID) values (current_timestamp,:KIND,:USER_ID)');
    trans3.StartTransaction;
    try
      query3.ParamByName('KIND').Value:= Fkind;
      query3.ParamByName('USER_ID').Value:= Fuser;
      query3.ExecQuery();
      PostToLog(Format('%d End execute', [Handle]));
    finally
      trans3.Commit;
      freeandnil(trans3);
      freeandnil(query3);
      CloseConnection;
    end;
  except
    on e: exception do
      PostToLog(e.Message);
  end;
end;



теперь в логе:
01.08.2017 14:18:57.769 : Create connection
01.08.2017 14:18:57.838 : 848 Start execute
01.08.2017 14:18:57.840 : 848 End execute
01.08.2017 14:18:57.845 : Close connection
01.08.2017 14:18:57.896 : Create connection
01.08.2017 14:18:57.964 : 1036 Start execute
01.08.2017 14:18:57.967 : 1036 End execute
01.08.2017 14:18:57.971 : Close connection
01.08.2017 14:18:58.032 : Create connection
01.08.2017 14:18:58.096 : 1064 Start execute
01.08.2017 14:18:58.099 : 1064 End execute
01.08.2017 14:18:58.103 : Close connection
01.08.2017 14:18:58.175 : Create connection
01.08.2017 14:18:58.249 : 1088 Start execute
01.08.2017 14:18:58.254 : 1088 End execute
01.08.2017 14:18:58.260 : Close connection


коннекты больше не висят
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39498142
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это вырезанный из моего проекта работающий код из многопоточного сервиса:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
const
    DBReadOnly                  = 0;
    DBReadWrite                 = 1;
    DBParams                    = 2;
    DBDBAService                = 3;
    DBDBA                       = 4;
    DBWriteAddAPointLog         = 5;

    DBLength                    = DBDBA;

var
    DBSqlQueries: array of string;
    CurrentDBServer: string;

// подготовка массивов запросов, тут у меня их много больше
procedure InitDBSqlQueries;
begin
    SetLength(DBSqlQueries, DBLength);
    DBSqlQueries[DBReadOnly] := 'read_committed'#13#10'rec_version'#13#10'nowait'#13#10'read';

    DBSqlQueries[DBReadWrite] := 'read_committed'#13#10'rec_version'#13#10'nowait';

    DBSqlQueries[DBParams] := 'user_name=SYSDBA'#13#10'password=masterkey'#13#10'sql_role_name='#13#10'lc_ctype=UTF8';

    DBSqlQueries[DBDBAService] := 'user_name=SYSDBA'#13#10'password=masterkey';
    DBSqlQueries[DBWriteAddAPointLog] := 'some internal query!';
    DBSqlQueries[DBDBA] := DBSqlQueries[DBDBAService]+''#13#10'lc_ctype=UTF8';
end;

// подготовка запроса
function PrepareQuery(const Qry: TIBQuery): boolean;
begin
    result := false;
    try
        Qry.Prepare;
        result := Qry.Prepared;
    except
        on E: EIBInterBaseError do begin
            PostToLog(Format(' :PrepareQuery, IBException %s: %s', [E.ClassName, E.ToString]));
        end;
        on E: Exception do begin
            PostToLog(Format(' :PrepareQuery, Exception %s: %s', [E.ClassName, E.ToString]));
        end;
    end;
end;

// выполнение/открытие запроса
function OpenQuery(const Qry: TIBQuery; const IsOpen: boolean = true): boolean;

    procedure DumpParameters;
    var i: integer;
        s: string;
    begin
        s := '';
        for I := 0 to Qry.ParamCount-1 do
            s := s + Format('%s=%s ', [Qry.Params[i].Name, Qry.Params[i].AsString]);
        if Length(s) > 0 then
            PostToLog(Format(' PARAMS: %s', [s]));
    end;

begin
    result := false;
    try
        if IsOpen then begin
            Qry.Open;
            PostToLog(Format(' :OpenQuery, recordCount: %d', [Qry.RecordCount]), WLL_EXTRA);
        end else begin
            Qry.ExecSQL;
            PostToLog(Format(' :ExecQuery, rowsAffected %d', [Qry.RowsAffected]), WLL_EXTRA);
        end;
        result := true;
    except
        on E: EIBInterBaseError do begin
            PostToLog(Format(' :OpenQuery, IBException %s: %s', [E.ClassName, E.ToString]));
            DumpParameters;
        end;
        on E: Exception do begin
            PostToLog(Format(' :OpenQuery, Exception %s: %s', [E.ClassName, E.ToString]));
        end;
    end;
end;

// подготовка соединения для обычного пользователя
function GetDB(const ReadOnly: boolean; Owner: TComponent = nil{; const Client: TMyClient = nil}): TIBDatabase;
begin
    // CurrentDBServer //'127.0.0.1:db'; // !!!
    if Length(Trim(CurrentDBServer)) = 0 then begin
        PostToLog(' :GetDB, there is no CurrentDBServer value');
        result := nil;
    end else begin
        result := TIBDatabase.Create(Owner);
        with result do begin
            LoginPrompt := false;
            DatabaseName := CurrentDBServer; //'127.0.0.1:db'; // !!!
            Params.Text := DBSqlQueries[DBParams];
            DefaultTransaction := TIBTransaction.Create(result);
            if ReadOnly then
                DefaultTransaction.Params.Text := DBSqlQueries[DBReadOnly]
            else
                DefaultTransaction.Params.Text := DBSqlQueries[DBReadWrite];
        end;
    end;
end;

// подготовка соединения от имени sysdba
function GetDBA: TIBDatabase;
begin
    if Length(Trim(CurrentDBServer)) = 0 then begin
        PostToLog(' :GetDB, there is no CurrentDBServer value');
        result := nil;
    end else begin
        result := TIBDatabase.Create(nil);
        with result do begin
            LoginPrompt := false;
            DatabaseName := CurrentDBServer;
            Params.Text := DBSqlQueries[DBDBA];
            DefaultTransaction := TIBTransaction.Create(result);
            DefaultTransaction.Params.Text := DBSqlQueries[DBReadWrite];
        end;
    end;
end;

// это пример вызова запроса с логированием ошибок
function AddApointLog(const AScheduleID, APoint: Int64): Int64;
var d: TIBDatabase;
    q: TIBQuery;
begin
    q := nil;
    d := nil;
    try
        d := GetDB(False, nil);
        q := TIBQuery.Create(nil);
        q.Transaction := d.DefaultTransaction;
        q.SQL.Text := DBSqlQueries[DBWriteAddAPointLog];
        if PrepareQuery(q) then begin
            q.ParamByName('APOINT_ID').Value := Apoint;
            if OpenQuery(q) then begin
                if q.RecordCount > 0 then begin
                    Result := q.FieldByName('id').AsLargeInt;
                end;
                q.Transaction.Commit;
                q.Database.Close;
            end;
        end else begin
            result := -1;
        end;
    finally
        d.DefaultTransaction.Free;
        q.Free;
        d.Free;
    end;
end;
               


Никаких утечек и умирания потоков, плюс логирование на всякие случаи.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39498160
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanЭто вырезанный из моего проекта работающий код из многопоточного сервиса:

Никаких утечек и умирания потоков, плюс логирование на всякие случаи.

Это надо всё продумать и обкатать.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39498161
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо за помощь
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39498166
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Получается, у меня не хватало деструктора,чтобы прибить отработавший поток?
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39498175
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

в качестве напутствияИгорь, у тебя бардак в коде. На его разбор у помогающих уходит много сил и времени. Возьми за правило (прости за тавтологию) соблюдать правила оформления и написания кода. Обрамляй потенциально "ошибочные" места блоками try..except, а места возможных утечек памяти блоком try..finally. Тогда ошибки будут очевидны даже при беглом взгляде, и ты не будешь иметь и половины тех проблем, которые описываешь здесь.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39498191
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GallemarЭто надо всё продумать и обкатать.замени свои 20689951 на эти:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
uses MyBrain; /// ! ))

/// constructor TMyThread.Create(CreateSuspended: Boolean;  var Apath1, Apath2,Akind,Alog,Aexe,Auser: string);
constructor TMyThread.Create(const Apath1, Apath2,Akind,Alog,Aexe,Auser: string);
begin
  	/// inherited Create(CreateSuspended);
  	/// CreateConnection;

  	Fpath1:= Apath1;
  	Fpath2:= Apath2;
  	Fkind:= Akind;
  	Flog:=Alog;
  	Fexe:=Aexe;
  	Fuser:=Auser;
       
        FreeOnTerminate := True;  /// 

        inherited Create; ///  Go!
end;

destructor TMyThread.Destroy;
begin
///		CloseConnection;
    inherited Destroy;
end;

procedure TMyThread.Execute;
begin
    // делаем что нужно
            PostToLog(Format('%d Start execute', [Handle]));

            CreateConnection; ///

            query3.SQL.Clear;
            query3.SQL.Add('insert into IMPORT_EXISTS_LOG (WRITE_TIME,KIND,USER_ID) values (current_timestamp,:KIND,:USER_ID)');
            trans3.StartTransaction;
         		query3.ParamByName('KIND').Value:= Fkind;
            query3.ParamByName('USER_ID').Value:= Fuser;
            query3.ExecQuery();
            trans3.Commit;
            query3.Close;
            freeandnil(trans3);
            freeandnil(query3);
            freeandnil(db3);

            CloseConnection; ///

            PostToLog(Format('%d End execute', [Handle]));
end;

...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39498588
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GallemarYuRockОн=деструктор. Во всяком случае, в IBX так.
пробовал,не помогает, ни try ... expert c проверкой исключений на ib3.connected:=False; ib3.Close; ib3.Free;, ни free после finally.
Потому, что туда "не доходит". Деструктор надо в finally вызывать, а не после except.

P.S. Слабо понятен смысл этого потока, если даже соединение с базой, такая тяжелая операция, происходит в конструкторе (не в потоке). Зачем, не понятно.

Я бы делал так примерно:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
procedure TMyThread.Execute;
begin
  Log( 'start' );
  try
    db := TpFIBDatabase.Create( nil );
    try
      // присваиваем строку подключения
      Log( 'try connect...' );
      db.Connected := True;
      Log( 'connected' );
      
      DoOperation; // в этой отдельной процедуре уже создаем/удаляем свои объекты, что-то делаем. 
    finally
      db.Free;
      Log( 'disconnected' );
    end;
  except
    on E: Exception do Log( 'Exception: ' + E.Message );
  end;
end;


И я уверен, что если в логе будет disconnected - соединения не будет.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39498677
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

имхо, обработка ошибок должна быть внутри, а не снаружи try..finally
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39498678
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокYuRock,

имхо, обработка ошибок должна быть внутри, а не снаружи try..finally

А в чем разница в приведенном случае ?
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39498698
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiДокYuRock,

имхо, обработка ошибок должна быть внутри, а не снаружи try..finally

А в чем разница в приведенном случае ?А разница есть. Если finally будет снаружи и в этом блоке произойдет исключение (что вполне вероятно), то оно окажется необработанным со всеми вытекающими. Что гораздо хуже хотя бы потому, что в лог оно не попадет.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39498885
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockschiпропущено...


А в чем разница в приведенном случае ?А разница есть. Если finally будет снаружи и в этом блоке произойдет исключение (что вполне вероятно), то оно окажется необработанным со всеми вытекающими. Что гораздо хуже хотя бы потому, что в лог оно не попадет.

Видишь ли, в чем дело - при записи в лог с ненулевой вероятностью тоже может возникнуть исключение, остающееся необработанным с теми же вытекающими.
...
Рейтинг: 0 / 0
25 сообщений из 99, страница 3 из 4
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не срабатывает отключение от базы пока не закрыта форма.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]