powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не срабатывает отключение от базы пока не закрыта форма.
99 сообщений из 99, показаны все 4 страниц
Не срабатывает отключение от базы пока не закрыта форма.
    #39497151
Фотография 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.
25.
26.
27.
 begin
                           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.DefaultUpdateTransaction:=trans3;
                            db3.LibraryName:= 'fbclient.dll';
                            trans3.DefaultDatabase:=db3;
                            query3.Database:=db3;
                            query3.Transaction:=trans3;
                            db3.connected:=True;
                                FindClose(tsr1);
                                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;
                                trans3.Free;
                                query3.Free;
                                 db3.connected:=False;
                                db3.Close;
                                  db3.Free;
                                    end;

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

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

как понял, что не срабатывает?


В mon$attachments коннекты висят, пока форму не закрою.
wadman На форме тоже есть подключение?
в том то и дело, что нету. Давай кину проектом, так проще будет.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497202
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

х.з. может, мониторинг где-то в fibplus включен, и это конфликтует с открытием и закрытием коннекта в треде. "В старину" даже коннект в треде глючил, поэтому коннект-дисконнект делался в основном потоке.
Но это все мои домыслы.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497211
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemarwadman На форме тоже есть подключение?
в том то и дело, что нету. Давай кину проектом, так проще будет.
Я у компа сегодня вряд-ли буду. Выкладывай, кто-то еще посмотрит. :-)
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497218
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497219
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvGallemar,

х.з. может, мониторинг где-то в fibplus включен, и это конфликтует с открытием и закрытием коннекта в треде.
Вряд ли, я всё прописывал в run-time, не помню ничего такого в fibplus, что могло по умолчанию быть.
kdv"В старину" даже коннект в треде глючил, поэтому коннект-дисконнект делался в основном потоке.
На фибах?
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497314
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

Попробуй фибам делать FreeAndNil вместо free
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497342
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,
С точки зрения фибов это не изменит ничего.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497343
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

А если вот так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
                  
trans3.Commit;
db3.Close;
db3.Сonnected := False;
query3.Free;
trans3.Free;
db3.Free;
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497344
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,
И ещё
Код: pascal
1.
query3.Close


сразу после коммита.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497372
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpС точки зрения фибов это не изменит ничего.
ага, а два контрольных выстрела
Код: pascal
1.
2.
db3.Close;
db3.Сonnected := False;


уж точно изменит
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497380
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокalekcvpС точки зрения фибов это не изменит ничего.
ага, а два контрольных выстрела
уж точно изменит
Заметь, я просто поменял местами строчки оригинального кода
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497406
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpGallemar,

А если вот так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
                  
trans3.Commit;
db3.Close;
db3.Сonnected := False;
query3.Free;
trans3.Free;
db3.Free;



alekcvpЗаметь, я просто поменял местами строчки оригинального кода


5 строк кода после коммита можно переставить 120 способами. Не все из них корректные, но все же...
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497407
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schi5 строк кода после коммита можно переставить 120 способами. Не все из них корректные, но все же...
В оригинале там транзакция уничтожается раньше, чем закрывается запрос, её использующий.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497413
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpschi5 строк кода после коммита можно переставить 120 способами. Не все из них корректные, но все же...
В оригинале там транзакция уничтожается раньше, чем закрывается запрос, её использующий.

В оригинале там трэш, угар и содомия. От людей, вкладывающих exeшники и dcu в архивы проекта, я не жду ничего хорошего.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497458
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокGallemar,

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

ага, а два контрольных выстрела
уж точно изменит
Заметь, я просто поменял местами строчки оригинального кода
Не помогло. Решил пока в качестве эксперимента переписать всё на ibx.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497515
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ыыы. интересный выстрел)
Если вас это утешит, то на FIB все закрывается корректно у меня вплоть до версии Berlin.
Единственная найденная проблема тянется еще из дремучих времен и относится к FibAlerter
Поэтому пришлось отказаться от событий. Но в целом нужно просто найти проблему и решить.
А "переписать на ibx" это выглядит как-то чрезмерно )
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497523
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

у тебя в потоке запускаются процессы, с которыми нет обратной связи до определенного момента. Я вижу два варианта решения проблемы:
1. можно завести какой-нибудь булев флаг и перед запуском очередного процесса в потоке проверять, нет ли команды прикончить поток(флаг взводить в OnCloseQuery формы), типа
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
procedure TMyThread.Execute
try
  if IsThreadTerm then exit;
  //запуск какого-то процесса

  if IsThreadTerm then exit;
  //запуск какого-то процесса

  if IsThreadTerm then exit;
  //запуск какого-то процесса

finally
  //всяческие FreeAndNil
end;



2. завести булев флаг, но сигнализирующий о продолжении или окончании потока, и и не давать закрываться форме (так же , в OnCloseQuery), пока поток не помрет естественной смерьтю.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497524
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krapotkinПоэтому пришлось отказаться от событий. Но в целом нужно просто найти проблему и решить.

Пока, увы, не получается.
krapotkinА "переписать на ibx" это выглядит как-то чрезмерно )
Почему? Программа простая.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497526
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокЯ вижу два варианта решения проблемы
кстати, эти два варианта можно объединить в третий: взвести флаг потоку, что ему нужно помереть при первой возможности, но форме не давать закрыться до смерти потока.

зы. это при условии, что у тебя проблема НЕ из-за неправильной логики в коде :)
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497530
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,хм, Эдик, а у меня в потоке формы не открываются, никакие. Есть одна, на которой кнопка для ручного запуска и кнопка для запуска таймера. Всё.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497531
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все таки не "пока не закрыта форма", а "пока не закрыто приложение".
И нет строки db4.free. В общем, ищи соединение, которое остается открытым в потоке.

Ну и лапшу-бы прибрать: вынести создание базы, транзакции и запроса и их уничтожение в отдельные процедуры.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497536
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanВсе таки не "пока не закрыта форма", а "пока не закрыто приложение".
Да, извините за неточность
wadmanИ нет строки db4.free. В общем, ищи соединение, которое остается открытым в потоке.
Уже есть, ещё вчера поправил. Пока тестировал понял, что все соединения остаются открытыми,исключений нет.
wadmanНу и лапшу-бы прибрать: вынести создание базы, транзакции и запроса и их уничтожение в отдельные процедуры.
Сделаю, извините, учусь программировать
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497541
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar, возьми мой пакет https://github.com/wadman/wthread/ в нем есть модуль wlog: для многопоточного логирования.
И на каждый чих пиши в лог, так будет понятно, что на самом деле происходит в других потоках.
Запустился поток - в лог, создал базу - в лог, дернул запрос - в лог, закрыл соединение - в лог, закончилось выполнение потока - в лог и т.д.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497544
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
      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);
        fini.free;
      end;


Что-то мне подсказывает, что эта строка должна быть вне цикла.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497559
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanЧто-то мне подсказывает, что эта строка должна быть вне цикла.
Что-то мне подсказывает, что это в соседнюю тему :)
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497609
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanИ на каждый чих пиши в лог, так будет понятно, что на самом деле происходит в других потоках.
Запустился поток - в лог, создал базу - в лог, дернул запрос - в лог, закрыл соединение - в лог, закончилось выполнение потока - в лог и т.д.
Пока сделал только на запуск потока. Из примера simpledemo взял процедуры, только в TForm1.AddLog вывод сделал в memo, запустил, в memo2 три строки вывелось:
Код: plaintext
1.
2.
15:37:56.783 : Old AffinityMask 0
15:37:56.783 : New AffinityMask 2
15:37:56.784 : Processor count: 4
,потом эксепшен Format '%s' invalid or incompatible with argument и всё. Что могло не форматироваться в строку?
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497612
Фотография 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.
25.
26.
27.
28.
29.
30.
31.
32.
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);
         [color=orange]AddLog(Format(rsOldAffinityMaskD, [WCThread1.AffinityMask])); //wadman
        WCThread1.AffinityMask := 2;//wadman
        AddLog(Format(rsNewAffinityMaskD, [WCThread1.AffinityMask]));//wadman
        AddLog(Format(rsProcessorCountD, [WCThread1.ProcessorCount]));//wadman
        MyThread:= TMyThread.Create(True,tpath1,tpath2,tkind,tlog,texe,tuser);
        AddLog(Format(rsSS, [MyThread, rsStart]));//wadman[/color]
      end;
    finally
      FreeAndNil(sections);
    end;
end;

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

Gallemarа у меня в потоке формы не открываются, никакие.
я говорил про главную форму :)
Вот смотри (извини, схематично, потому что на коленке без D7)
Код: 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.
TMyThread.Create
  ...
  TForm1.FThreadIsDead:= False;//поток живой, не умер
  ...

TForm1 = class(TForm);
  ...
  FThreadIsDead,
  FIsThreadTerm: boolean;
  ...

TForm1.<кнопка запуска потока>
  ...
  FIsThreadTerm:= False;//нет команды потоку умереть
  FThreadIsDead:= False;//поток живой, не умер
  ...

TForm1.<событие завершения потока>
  ...
  FIsThreadTerm:= True;//потоку пора умереть
  ...
 
procedure TMyThread.Execute
try
  if TForm1.IsThreadTerm then exit;
  //запуск какого-то процесса

  if TForm1.IsThreadTerm then exit;
  //запуск какого-то процесса

  if TForm1.IsThreadTerm then exit;
  //запуск какого-то процесса

finally
  //всяческие FreeAndNil
  SendMessage(...) // посылаем форме сообщение, что можно сделать FThreadIsDead:= True, сообщив, что поток уже того
end;

TForm1.OnCloseQuery
  if not FThreadIsDead then exit;//нельзя закрыть, пока поток жЫв
  ...

...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497650
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и совсем не нужно из потока к форме обращаться, и свойство Terminated у потока есть своё
и TForm1 - это класс, а не объект
модуль потока лучше вообще не uses модуль формы

Код: 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.
TForm1=class(TForm)
  FClosing:boolean;
  FThreads:TObjectlist;
  procedure RunThread;
  procedure ThreadTerminated(Sender:TObject);
end;

procedure TForm1.ThreadTerminated(Sender:TObject);
var th:TMyThread absolute Sender;
begin
  FThreadList.Remove(th);
  if not FClosing then
    /// заполняем поля формы результатами работы потока
end;

procedure TForm1.RunThread;
var th:TMyThread;
begin
  Th := TMyThread.Create;
  Th.OnTerminate := ThreadTerminated;
  Th.FreeOnTerminate := true;
  FThreadList.Add(th);
end;

procedure TForm1.FormClose(....);
var i:integer;
begin
  FClosing:=true;
  for i:=0 to FThreadList.Count-1 do
    (FThreadList[i] as TMyThread).terminate;
end;



Код: pascal
1.
2.
3.
4.
5.
procedure TMyThread.Execute;
begin
  while not Terminated do
  ....
end;
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497655
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar
Код: pascal
1.
2.
3.
        WCThread1.AffinityMask := 2;//wadman
        AddLog(Format(rsNewAffinityMaskD, [WCThread1.AffinityMask]));//wadman
        AddLog(Format(rsProcessorCountD, [WCThread1.ProcessorCount]));//wadman


Используешь мою компоненту (добавил TTask и выполняешь работу в его событии Execute)?
Если нет, то это тебе не нужно.

Для логирования нужно было использовать эти функции:
Код: pascal
1.
2.
3.
4.
function PostToLog(const Text: string): boolean; overload; // with WLL_NORMAL
function PostToLog(const Text: string; const Level: TLogLevel): boolean; overload;
function PostToLog(const ADateTime: TDateTime; const Text: string): boolean; overload; // with WLL_NORMAL
function PostToLog(const ADateTime: TDateTime; const Text: string; const Level: TLogLevel): boolean; overload;


Они пишут лог в файл.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497660
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
переписал на IBX :) аналогично - коннекты держатся до закрытия приложения.
for Док - я осмыслю твой совет буду пробовать.
for wadman - можешь подсказать как дальше сделать?
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497668
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krapotkinсвойство Terminated у потока есть своё
формально, да. Но лучше натянуть презерватив на огурец, а то случаи разные бывают :)
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497669
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krapotkin
Код: pascal
1.
2.
3.
4.
5.
procedure TMyThread.Execute;
begin
  while not Terminated do
  ....
end;


у него цикл одноразовый, поэтому твой совет в контексте его кода не имеет смысл
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497680
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemarможешь подсказать как дальше сделать?
Два варианта:
1. Допиливаешь свой вариант, но с применением моего логирования.
2. Переходишь на мой компонент. :)
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497686
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanДва варианта
Вот так и вербуют неопытных

Игорь, выбирай первый. Я тебе давно советовал
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497702
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
Игорь, выбирай первый. Я тебе давно советовал
Что именно советовал? Логировать?
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497723
Фотография 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.
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
    Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, wlog, IBDatabase, IBQuery;

type

    { TMyThread }

    TMyThread = class(TThread)
    private
        FSomeVar: string;
        FIB: TIBDataBase;
        FTrans: TIBTransaction;
        FQuery: TIBQuery;
        procedure CreateConnection;
        procedure CloseConnection;
    public
        constructor Create(const ASomeVar: string);
        destructor Destroy; override;
        procedure Execute; override;
        property SomeVar: string read FSomeVar;
    end;

    TForm1 = class(TForm)
    private

    public

    end;

var
    Form1: TForm1;

implementation

{$R *.lfm}

{ TMyThread }

procedure TMyThread.CreateConnection;
begin
    // подключаемся, настраиваем транзакцию и т.п
    // логируем через wlog
    PostToLog('Create connection');
end;

procedure TMyThread.CloseConnection;
begin
    // закрываем соединение
    PostToLog('Close connection');
end;

constructor TMyThread.Create(const ASomeVar: string);
begin
    FSomeVar := ASomeVar;
    CreateConnection;
end;

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

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

end.


Открытие, закрытие соединения вынесено отдельно, для проверки версии kdv: 20685657
Если не поможет, то всегда может перенести обратно в поток.
Не стоит на каждый чих создавать новое соединение, одного вполне хватит на один поток.
Ну и плюсом соединение и выполнение запросов оберни try except и ошибки тоже пиши в лог.
Может твои потоки валятся и потому соединение остается жить.
PostToLog создаст файл с расширением .log и будет в него писать логи.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497826
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GallemarЛогировать?
да. Не понятна логика ошибок, трудно/невозможно дебажить - логируй. И да, wadman прав: убери fini.free из цикла в секцию finally (перед уничтожением стринглиста)
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497909
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доктрудно/невозможно дебажить - логируй.
ДокGallemarЛогировать?
да. Не понятна логика ошибок, трудно/невозможно дебажить - логируй. И да, wadman прав: убери fini.free из цикла в секцию finally (перед уничтожением стринглиста)
Логирование исключений покажет очевидное: из-за исключения код не доходит до
db3.connected:=False;

Кстати, на

db3.Close

Сннова упадет (скорее всего), т.к. обычно это то же самое, только без проверки.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497911
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче, после создания объекта базы сделай try и в finally сделай Free - он автоматом вызовет и дисконнект.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497914
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Он=деструктор. Во всяком случае, в IBX так.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497930
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

замени, пожалуйста, строчку
Код: pascal
1.
                            db3.DatabaseName:='d:\fdbase\fb_log_database.fdb';

на
Код: pascal
1.
                            db3.DatabaseName:='localhost:d:\fdbase\fb_log_database.fdb';
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39497946
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДGallemar,

замени, пожалуйста, строчку
Код: pascal
1.
                            db3.DatabaseName:='d:\fdbase\fb_log_database.fdb';

на
Код: pascal
1.
                            db3.DatabaseName:='localhost:d:\fdbase\fb_log_database.fdb';


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

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

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

проблему-то решил?
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #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);
      //&#239;&#240;&#238;&#245;&#238;&#228;&#232;&#236; &#239;&#238; &#237;&#224;&#241;&#242;&#240;&#238;&#233;&#234;&#224;&#236;, &#239;&#238;&#235;&#243;&#247;&#224;&#229;&#236; &#239;&#243;&#242;&#232;
      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
Не срабатывает отключение от базы пока не закрыта форма.
    #39498908
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiYuRockпропущено...
А разница есть. Если finally будет снаружи и в этом блоке произойдет исключение (что вполне вероятно), то оно окажется необработанным со всеми вытекающими. Что гораздо хуже хотя бы потому, что в лог оно не попадет.

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

Это раз, а два - в этом случае упасть может только при записи в лог, а если наоборот - то и при записи в лог, и потом еще в finally.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39498946
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanНе в моем случае.
Думаю, в случае функции логирования допустима даже такая конструкция
Код: pascal
1.
2.
3.
4.
5.
6.
procedure Log( const S: String );
begin
  try
    // Ну а здесь добавление в очередь записи в лог
  except end; 
end;
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39498948
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockwadmanНе в моем случае.
Думаю, в случае функции логирования допустима даже такая конструкция
Код: pascal
1.
2.
3.
4.
5.
6.
procedure Log( const S: String );
begin
  try
    // Ну а здесь добавление в очередь записи в лог
  except end; 
end;


Собственно так и делается: https://github.com/wadman/wthread/blob/master/wlog.pas
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39498966
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanСобственно так и делается: https://github.com/wadman/wthread/blob/master/wlog.pas
Оффтоп:
1. А чё ты не даёшь пустую строку в лог добавить? Имхо лишняя проверка. К тому же не запишется в лог, например, значение строковой переменной, если она пустая строка, это может быть важно.
2. Формат даты в логах я у себя уже много лет назад переделал с dd.mm.yyyy на yy.dd.mm - экономия 2 байтов в каждой строке это не мало, когда логи занимают десятки/сотни гигабайт, это ~5-10% от этого размера.
3. Использование системной очереди сообщений, как видно, используется. Я бы для такого свою очередь сделал. Но это дело вкуса.
4. Ну и самое страшное (так да немного не так)
Код: 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.
function OpenLog: boolean;
begin
    result := false;
    try
        AssignFile(log, WLogFileName);
        if (FileExists(WLogFileName))and(not WLogClearOnStart) then begin
            Append(log);
            if FirstLine then begin
                WriteLn(log);
                FirstLine := false;
            end;
        end else begin
            WLogClearOnStart := false;
            Rewrite(log);
        end;
        result := true;
    finally

    end;
end;

function CloseLog: boolean;
begin
    result := false;
    try
        CloseFile(log);
        result := true;
    finally

    end;
end;

function AddToLog(const DT: TDateTime; const Text: string): boolean;

    function ClearText(const AText: string): String;
    var i: integer;
    begin
        result := AText;
        for I := 1 to Length(result) do
            if Ord(result[i]) < 32 then
                result[i] := '.';
    end;

begin
    result := false;
    try
        WriteLn(log, Format('%s : %s', [FormatDateTime('dd.mm.yyyy hh:nn:ss.zzz', DT), ClearText(Text)]));
        result := true;
    finally
    end;
end;

procedure TLogThread.WMErase(var Msg: TThreadMessage);
var f: File;
begin
    if FileOpened then
        FileOpened := not CloseLog;
    try
        if (not FileOpened) and (FileExists(WLogFileName)) then begin
            AssignFile(f, WLogFileName);
            Erase(f);
        end;
    finally

    end;
end;

...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39498967
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockс dd.mm.yyyy на yy.dd.mm
на yy.mm.dd
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39498979
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockЯ бы для такого свою очередь сделал.
Включается автоматом на никсах, а в винде по условию компиляции (там inc есть).
Остальное - мелочи. Особенно про пустую переменную - на кой она нужна, если её не идентифицировать названием?
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39498989
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanОстальное - мелочи.
Ну как сказать. finally вместо except это описка, да, но отнюдь не мелочь)
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39498991
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanна кой она нужна, если её не идентифицировать названием?
Накой эту проверку делать? Если её идентифицировать названием - то эта проверка и так будет бесполезна - всегда будет True.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39499028
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockwadmanОстальное - мелочи.
Ну как сказать. finally вместо except это описка, да, но отнюдь не мелочь)
В чем разница?
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39499036
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanВ чем разница?
В чем разница между finally и except относительно wlog.pas?
Файл может остаться висеть открытым вечно, например, в случае исключения при записи.
Память не будет освобождаться, например, в TLogThread.WMLog при любом исключении.
Да ну блин, ты что, травишь? Это логическая ошибка, подправь и закоммить, люди ж пытаются пользоваться вроде. Впрочем, дело твоё.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39499038
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В чем разница между
Код: pascal
1.
2.
3.
4.
5.
6.
procedure Log( const S: String );
begin
  try
    // Ну а здесь добавление в очередь записи в лог
  except end; 
end;


и
Код: pascal
1.
2.
3.
4.
5.
6.
procedure Log( const S: String );
begin
  try
    // Ну а здесь добавление в очередь записи в лог
  finally end; 
end;


?
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39499072
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanВ чем разница между
Код: pascal
1.
2.
3.
4.
5.
6.
procedure Log( const S: String );
begin
  try
    // Ну а здесь добавление в очередь записи в лог
  except end; 
end;


и
Код: pascal
1.
2.
3.
4.
5.
6.
procedure Log( const S: String );
begin
  try
    // Ну а здесь добавление в очередь записи в лог
  finally end; 
end;


?

Разница в том, что вторая конструкция не имеет смысла. Если при записи возникнет исключение, оно будет передано наверх, в отличие от первого случая, когда оно будет заглушено.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39499078
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
Код: pascal
1.
2.
3.
4.
5.
6.
procedure Log( const S: String );
begin
  try
    // Ну а здесь добавление в очередь записи в лог
  finally end; 
end;


это эквивалентно
Код: pascal
1.
2.
3.
4.
procedure Log( const S: String );
begin
  // Ну а здесь добавление в очередь записи в лог
end;
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39499148
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanСобственно так и делается: https://github.com/wadman/wthread/blob/master/wlog.pas
Тоже оффтоп:
Код: pascal
1.
2.
3.
function InitLogs: boolean;
begin
    WLogFileName := ChangeFileExt(ParamStr(0), '.log');



Ограниченным учёткам логов не нужно? :)
IMHO на винде имеет смысл писать в %AppData%\%AppName%[\Logs].
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39499152
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И ещё:
Код: pascal
1.
2.
3.
  WriteLn(log, Format('%s : %s', [FormatDateTime('dd.mm.yyyy hh:nn:ss.zzz', DT), ClearText(Text)]));
  flush(log); // иначе есть неиллюзорный шанс недосчитаться записей в логах, при вылете из-за OutOfMemory или AV
  result := true;
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39499157
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpОграниченным учёткам логов не нужно? :)
Разработчику это не нужно, т.к. проект запускается из папки, куда запись разрешена.
Но если что, это переменная, заполняемая умолчательным значением и её можно менять.

От флеша я по каким-то причинам отказался в свое время в результате экспериментов.

schiЕсли при записи возникнет исключение, оно будет передано наверх, в отличие от первого случая, когда оно будет заглушено.
Ок, понял. Меня именно такое поведение и устраивает.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39499183
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanМеня именно такое поведение и устраивает.
Когда память не освобождается и/или файл открытый остается висеть? А так же прекращение работы потока логирования на первом же исключении при попытке записи (например, файл монопольно занят копированием)? Ну, ок.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39499694
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

Промолчу про качество кода...
То, что соединение остаётся открытым - нормально.
Более того, так задумано - это называется Connection Pooling.
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39499698
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valery_BБолее того, так задумано - это называется Connection Pooling.
кем задумано?
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39499793
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39499803
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valery_B http://www.google.ru/search?ie=UTF-8&hl=ru&q=connection pooling
Я знаю, что это такое. Откуда вообще взялась мысль, что ТС это задумывал?
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39499928
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanВ чем разница между
Код: pascal
1.
2.
3.
4.
5.
6.
procedure Log( const S: String );
begin
  try
    // Ну а здесь добавление в очередь записи в лог
  except end; 
end;


и
Код: pascal
1.
2.
3.
4.
5.
6.
procedure Log( const S: String );
begin
  try
    // Ну а здесь добавление в очередь записи в лог
  finally end; 
end;


?"Ну вы, блин, даете!!!" (с)
...
Рейтинг: 0 / 0
Не срабатывает отключение от базы пока не закрыта форма.
    #39500038
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanЯ знаю, что это такое. Откуда вообще взялась мысль, что ТС это задумывал?
не задумывал. Вообще код переписан,работает в продуктиве. Хочется кому-нибудь приватно показать, на предмет улучшений.
...
Рейтинг: 0 / 0
99 сообщений из 99, показаны все 4 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не срабатывает отключение от базы пока не закрыта форма.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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