powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не срабатывает отключение от базы пока не закрыта форма.
25 сообщений из 99, страница 2 из 4
Не срабатывает отключение от базы пока не закрыта форма.
    #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
25 сообщений из 99, страница 2 из 4
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не срабатывает отключение от базы пока не закрыта форма.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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