Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Lazarus: коннект в потоке / 25 сообщений из 125, страница 1 из 5
22.05.2017, 08:55
    #39457066
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: коннект в потоке
Мужики, хотел внести для себя ясность в вопросе, которым только начал заниматься.

В приложении на главной форме FrmMain лежит TIBDatabase. Делаю коннект потоке (схематично)
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure TMyThread.Execute;
begin
  try
    FrmMain.IBDatabase.Connected:= True;
  except
    //bla-bla-bla
  end;
end;  



Соответственным образом коннекчусь к таблям.
Под виндой проблем нет, под никсами приложение валится через раз.

Поэтому хотел уточнить, это корректный код? Если создавать компоненты доступа динамически (объявив, как приватные поля класса TMyThread, типа FIBDatabase), то после уничтожения этого экземпляра потока FIBDatabase тоже умрет?
=================
Док.

Win7 Ultim x64/Deb 8.7 i386:
FB 3.0.2.32703, диалект 3, SS(win)/SC(Deb),
Lazarus 1.9(r.54844); FPC 3.1.1 (r.36160), IBX by -Rik-; IBE 2016.5.14.1
...
Рейтинг: 0 / 0
22.05.2017, 09:03
    #39457074
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: коннект в потоке
В потоке только подключение?
Как потом с базой идет работа? Как форма узнает о результате?

Докпосле уничтожения этого экземпляра потока FIBDatabase тоже умрет?
Вряд-ли, т.к. поток не компонент. Его не указать владельцем (чтоб он всех своих за собой "забрал").
...
Рейтинг: 0 / 0
22.05.2017, 09:31
    #39457080
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: коннект в потоке
wadmanВ потоке только подключение?
нет, там работа с таблями: селекты, апдейты, выполнение процедур на сервере
wadmanКак форма узнает о результате?
о каком результате речь?
...
Рейтинг: 0 / 0
22.05.2017, 09:34
    #39457082
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: коннект в потоке
Доко каком результате речь?
О результате работы потока. База-то на форме?

П.С. Если работа вся в потоке, то я-бы все необходимое для этой работы в потоке и создавал/удалял.
...
Рейтинг: 0 / 0
22.05.2017, 09:42
    #39457085
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: коннект в потоке
wadmanО результате работы потока. База-то на форме?
Ну, естессно. В стартовом посте написал. После коннекта и пары проверок все селекты в гридах отображаются корректно. Вот только на Дебе падает через раз.

Откатиться, что ли, на предыдущие релизы Лазаря? Или попробовать UIB вместо IBX - ума не приложу...
...
Рейтинг: 0 / 0
22.05.2017, 09:48
    #39457093
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: коннект в потоке
ДокПосле коннекта и пары проверок все селекты в гридах отображаются корректно.
Это же соединение потом в визуальной части используется? Если да, то как результат работы потока обрабатывается?
Из стартового поста не видно как реально используется поток и база.
ДокИли попробовать UIB вместо IBX - ума не приложу...
Вряд-ли это поможет.
ДокВот только на Дебе падает через раз.
С какой ошибкой?
...
Рейтинг: 0 / 0
22.05.2017, 10:45
    #39457135
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: коннект в потоке
wadmanЭто же соединение потом в визуальной части используется? Если да, то как результат работы потока обрабатывается?
В потоке поэтапно проходит сначала коннект к базе, затем проверки (грузятся настройки юзверя для отображения ), затем открывается табля с гридом на форме и поток завешается и умирает

wadmanС какой ошибкой?
доберусь до дома, покажу
...
Рейтинг: 0 / 0
22.05.2017, 11:39
    #39457189
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: коннект в потоке
1. С одним коннектом может работать только один поток
2. Если несколько потоков создают коннекты, то эта процедура должна быть синхронизирована единым мьютексом
3. Пункт 2 распространяется на весь процесс. И если коннекты создаются в разных dll, то также должен использоваться единый мьютекс
...
Рейтинг: 0 / 0
22.05.2017, 12:15
    #39457222
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: коннект в потоке
_Vasilisk_, 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.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
    { TDataMsg }

    TDataMsg = record
      Msg: DWord;
      WParam: Word;
      LParam: NativeInt;
    end;

    //вариант сценария работы дополнительного потока
    MyThreadTarget = (mttConnectDB, mttDisconnectDB, mttOpenDSet);   

//==========================
procedure TMyThread.Execute;
var MyMsg: TDataMsg;
    ErrMsg: String;
    i: Integer;
begin
  //реализуем тот или иной функционал потока в зависимости от заданной цели
  case FThreadTarget of
 {======================================================================================}
    //коннект к базе и основным таблицам
    mttConnectDB:
      try {цикл коннекта к базе и проверок}
        //задаем параметры коннекта
        with FrmMain.DBase_main do
          begin
            DatabaseName:= FDbName;
            LibraryName:= FLibName;
            Params.Add('lc_ctype=' + FChrSet);//чарсет коннекта
            Params.Add('user_name=' + FUsrNm);//имя юзера
            Params.Add('password=' +FPW);//пароль
            if Trim(FUsrRole) <> ''
              then Params.Add('sql_role_name=' + FUsrRole);//роль, если задана
          end;

        //запускаем фоновый поток коннекта
        try {коннект к базе данных}
          //коннектимся к базе (передаем сообщение в LabelMsg)
          MyMsg.LParam:= NewString('Коннектимся к базе данных');
          SendMessage(FrmMain.Handle, WM_GETFORSPLASHSTR_MSG, 0, MyMsg.LParam);

          //спрячем левую кнопку на сплэше
          MyMsg.WParam:= 0;
          MyMsg.LParam:= NewString('');
          SendMessage(FrmMain.Handle, WM_GETFORBTNLEFT_MSG, MyMsg.WParam, MyMsg.LParam);

          //текст для правой кнопки
          MyMsg.LParam:= NewString('Прервать');
          MyMsg.WParam:= 1;
          SendMessage(FrmMain.Handle, WM_GETFORBTNRIGHT_MSG, MyMsg.WParam, MyMsg.LParam);

          Sleep(1000);

          if not FrmMain.DBase_main.Connected then FrmMain.DBase_main.Connected:= True;

        except {коннект к базе данных}
           on E:EIBError do
             begin
               case EIBError(E).IBErrorCode of
         335544344: ErrMsg:= 'Не могу подключиться к указанному файлу базы данных. ' +
                             'Возможно, его уже успели переименовать, переместить, удалить или у вас нет на него прав';
         335544472: ErrMsg:= 'Введенный пароль не соответствует вашему логину. Уточните ваш логин и ' +
                             'пароль у администратора базы данных';
                 else
                    ErrMsg:= {$IFDEF UNIX} E.Message; {$ELSE} WinCPToUTF8(E.Message); {$ENDIF}
               end;


               //передаем текст сообщения в мемо
               MyMsg.lParam:= NewString(ErrMsg);
               SendMessage(FrmMain.Handle, WM_GETFORSPLASHSTR_MSG, 0, MyMsg.LParam);

               i:= 10;//счетчик на 10 циклов

               //немного заморозим отрисовку на(i) циклов, чтобы юзер смог осмыслить сообщение об ошибке,
               //пока не окончился таймер или не прилетело сообщение из сплеша, что там нажата кнопка 'Esc'
               while (i > 0) and (not FrmMain.FIsFinishedThread) do
               begin
                 Dec(i);
                 {$IFDEF UNIX}
                   MyMsg.LParam:= NewString(Format('Закрыть (%d)',[i]));
                   MyMsg.WParam:= 1; //нажатие левой кнопки с обратным отсчетом завершит поток
                   SendMessage(FrmMain.Handle, WM_GETFORBTNRIGHT_MSG, MyMsg.WParam, MyMsg.LParam);

                   MyMsg.LParam:= NewString('Сохранить в буфер обмена');
                   MyMsg.WParam:= 2; //нажатие правой кнопки сохранит текст ошибки в буфер обмена и завершит поток
                   SendMessage(FrmMain.Handle, WM_GETFORBTNLEFT_MSG, MyMsg.WParam, MyMsg.LParam);
                 {$ELSE}
                   MyMsg.LParam:= NewString(Format('Закрыть (%d)',[i]));
                   MyMsg.WParam:= 1; //нажатие левой кнопки с обратным отсчетом завершит поток
                   SendMessage(FrmMain.Handle, WM_GETFORBTNLEFT_MSG, MyMsg.WParam, MyMsg.LParam);

                   MyMsg.LParam:= NewString('Сохранить в буфер обмена');
                   MyMsg.WParam:= 2; //нажатие правой кнопки сохранит текст ошибки в буфер обмена и завершит поток
                   SendMessage(FrmMain.Handle, WM_GETFORBTNRIGHT_MSG, MyMsg.WParam, MyMsg.LParam);
                 {$ENDIF}

                 Sleep(1000);
               end;

               FrmMain.FIsFinishedThread:= True;//сообщим сплешу, что поток закончился и можно закрыться
               Exit;//переходим к секции finally
             end; {on E:EIBError do}
        end; {коннект к базе данных}

        try {коннект к таблице с настроками пользователя}
          with FrmMain do
          begin {with FrmMain do}
            MyMsg.LParam:= NewString('Загружаем или создаем настройки пользователя');
            SendMessage(Handle, WM_GETFORSPLASHSTR_MSG, 0, MyMsg.lParam);

            Sleep(1000);

            //проверяем, есть ли у этого юзера запись в таблице настроек
            QrySettings.SQL.Text:=
            'SELECT COUNT (RDB$DB_KEY) AS cnt FROM RDB$DOCSETTINGS WHERE NAME = UPPER(:prmUsrName)';
            QrySettings.Prepare;
            QrySettings.ParamByName('prmUsrName').Value:= FUsrNm;
            QrySettings.Open;

            //если нет, то создаем запись с его именем и дефолтовыми настройками
             if QrySettings.FieldByName('cnt').AsInteger = 0 then
             begin
               TransWrite_main.StartTransaction;
               try {try .. except попытка записи в таблю настроек}
                 ExecSql_Settings.SQL.Text:= 'EXECUTE PROCEDURE CREATE_DOCSETTINGS_NEW_USER (:prmNAME,:prmNOTE)';
                 ExecSql_Settings.Params.ByName('prmNAME').Value:= LowerCase(UsrNm);
                 ExecSql_Settings.Params.ByName('prmNOTE').Value:= '';
                 ExecSql_Settings.ExecQuery;
                 TransWrite_main.Commit;
               except {try .. except попытка записи в таблю настроек}
                 TransWrite_main.Rollback;
                 FCurrentUser:= 'DEFAULT_USER';//текущий юзер для загрузки настроек

                 // далее поскипал однотипный код
				 
                 //если нажали кнопку 'Нет' на сплэше, то переходим в блок finally и прерываем коннект
                 if FIsFinishedThread then Exit;
               end; {try .. except попытка записи в таблю настроек}
             end;
          end; {with FrmMain do}
        except {коннект к таблице с настроками пользователя}
          FrmMain.FCurrentUser:= 'DEFAULT_USER'; //текущий юзер для загрузки настроек
          // далее поскипал
          
          //если нажали кнопку 'Прервать' на сплэше, то переходим в блок finally и прерываем коннект
          if FrmMain.FIsFinishedThread then Exit;
        end; {коннект к таблице с настроками пользователя}


      {TODO: отладить настройки юзера}

        //грузим настройки юзера
        //FrmMain.LoadAppSettings;


        try {коннект к остальным данным}

          //коннектимся к таблице
          MyMsg.LParam:= NewString('Получаем данные');
          SendMessage(FrmMain.Handle, WM_GETFORSPLASHSTR_MSG, 0, MyMsg.LParam);

          //спрячем левую кнопку на сплэше, передав туда "нулевой" признак видимости
          MyMsg.WParam:= 0;
          MyMsg.LParam:= NewString('');
          SendMessage(FrmMain.Handle, WM_GETFORBTNLEFT_MSG, MyMsg.WParam, MyMsg.LParam);

          //текст для правой кнопки
          MyMsg.LParam:= NewString('Прервать');
          MyMsg.WParam:= 1;
          SendMessage (FrmMain.Handle, WM_GETFORBTNRIGHT_MSG, MyMsg.WParam, MyMsg.LParam);

          Sleep(1000);

          FrmMain.QrySelect.Active:= True;
        except {коннект к остальным данным}
         on E:EIBError do
           begin
             //текст ошибки
             {$IFDEF UNIX} ErrMsg:= E.Message; {$ELSE} ErrMsg:= WinCPToUTF8(E.Message); {$ENDIF}

             // далее поскипал однотипный код
             FrmMain.FIsFinishedThread:= True;//сообщим сплешу, что поток закончился и можно закрыться
             Exit;//переходим к блоку код в finally
           end;
        end; {коннект к остальным данным}


      finally {цикл коннекта к базе и проверок}
        //если ранее взвели флаг окончания потока
        if FrmMain.FIsFinishedThread
          then //то прервем коннект
            begin
              FrmMain.DBase_main.Connected:= False;
            end
          else //иначе доведем дело до конца
            begin
              //если коннект успешный, применяем загруженные настройки
              if FrmMain.DBase_main.Connected then FrmMain.SetAppSettings;

              //взведем флажок (чтобы сплэш знал о завершении потока и дал себя закрыть)
              FrmMain.FIsFinishedThread:= True;
            end;

        //закроем сплэш
        SendMessage(FrmMain.Handle,WM_CLOSESPLASHFORM_MSG,0,0);
      end; {цикл коннекта к базе и проверок} {mttConnectDB:}

{======================================================================================}
    mttDisconnectDB: ;

{======================================================================================}
    mttOpenDSet: ;

  end; {case FThreadTarget of}


end;    

создаю и запускаю поток
Код: 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.
procedure TFrmMain.ActOpenDBExecute(Sender: TObject);
begin
  if Assigned(FConnectThread) then Exit;//если поток все еще крутится, выйдем отседова

  FCurrentUser:= UsrNm;//запоминаем залогинившегося юзера

  //создаем приостановленный поток
  FConnectThread:= TMyThread.Create(True);

  try
    //определяем, какая часть потока бцдет реализована
    FConnectThread.FThreadTarget:= mttConnectDB;

    //передаем параметры коннекта в фоновый поток
    with FConnectThread do
      begin
        FChrSet:= ChrSet;
        FDbName:= DBName;
        FLibName:= LibName;
        FUsrNm:= UsrNm;
        FPW:= PW;
        FUsrRole:= UsrRole;
      end;

    //создаем сплэш
    SplashForm:= TFrmSplash.Create(Application);

    //стартуем ожидающий поток
    FConnectThread.Start;
    try
      SplashForm.ShowModal;//показываем сплэш
    finally
      FreeAndNil(SplashForm);
    end;
  finally
    FreeAndNil(FConnectThread);
  end; 



В результате, на никсах, видно подтормаживание анимации, и через раз лезет окно с ошибкой (обычно в конце цикла коннекта)
Код: pascal
1.
2.
3.
Проект <тут название моего проекта> вызвал класс исключения 'External: SIGABRT'.

 По адресу B7FDCD40


В окне ассемблера
Код: pascal
1.
B7FDCD40 5d                       pop    %ebp


при попытке войти отладчиком в процедуру получаю
Код: pascal
1.
00000000 ??????


В файле проекта вроде все должно быть корректно
Код: 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.
program andrology_pr;

{$mode objfpc}
{$H+}
{$codepage UTF8}

uses
  {$IFDEF UNIX}
  cthreads
  , cmem
  ,
  {$ENDIF}
  Interfaces, // this includes the LCL widgetset
  Forms, rxnew, ibexpress, main_u, main_functions_u, splash_u, variable_u,
  dm_pict_u;

{$R *.res}

begin
  Application.Scaled:=True;
  Application.Title:='<название проекта>';
  RequireDerivedFormResource := True;
  Application.Initialize;
  Application.CreateForm(TDM_pictures, DM_pictures);
  Application.CreateForm(TFrmMain, FrmMain);
  Application.Run;
end.



ps. У меня ощущение, что приложению оперативки не хватает (Деб крутится на виртуалке с RAM 2048 kB). пробовал выделить ей 4 гига, картина та же
...
Рейтинг: 0 / 0
22.05.2017, 12:49
    #39457263
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: коннект в потоке
ДокВ окне ассемблера
Код: pascal
1.
B7FDCD40 5d                       pop    %ebp


А выше что? Похоже, что перед выходом из некой процедуры стэк ломаный, возможно обращение к (уже) несуществующему объекту.
Док
Код: pascal
1.
if FrmMain.DBase_main.Connected then FrmMain.SetAppSettings;


Тут нет обращения к визуальной части?
...
Рейтинг: 0 / 0
22.05.2017, 13:15
    #39457291
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: коннект в потоке
1. в отладке может что-то видно?
2. в основном потоке код работает?
...
Рейтинг: 0 / 0
22.05.2017, 13:26
    #39457306
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: коннект в потоке
makhaon,

отладчик в Лазаре никакущий, в потоке вообще отладить что-либо сложно, если только пользовать DebugLn.

Как назло, решил переставить новую ревизию (в предыдущей че-та с настройками случилось - не сохраняются). Теперь не компилится с ошибкой "...lazarus_trunk\ide\sourcefilemanager.pas(6459,27) Error: (5038) identifier idents no member "DesignPPI"". Ужос!!!


зы. щас, разберусь со средой, отвечу :)
...
Рейтинг: 0 / 0
22.05.2017, 14:02
    #39457343
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: коннект в потоке
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.
procedure TFrmMain.SetAppSettings;
begin
//определяем доступность грида в зависимости от состояния коннекта
Grid_main.Enabled:= DBase_main.Connected;

//настройки сетки
with Grid_main do
  begin
    if Enabled
      then
        begin
          TitleFont.Color:= clDefault;
        end
      else
        begin
          TitleFont.Color:= clGrayText;
        end;
  end;


//и далее в том же духе

// для отладки
if FrmMain.DBase_main.Connected
  then FrmMain.Label4.Caption:= 'connected'
  else FrmMain.Label4.Caption:= 'not connected';
end;

...
Рейтинг: 0 / 0
22.05.2017, 14:16
    #39457365
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: коннект в потоке
ДокЕсть, и еще какое.
Дак нельзя так делать.
...
Рейтинг: 0 / 0
22.05.2017, 15:31
    #39457460
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: коннект в потоке
wadmanДак нельзя так делать.
а если загрузка настроек из табли длительная, то как быть. В следующем потоке делать?
...
Рейтинг: 0 / 0
22.05.2017, 15:41
    #39457473
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: коннект в потоке
ДокwadmanДак нельзя так делать.
а если загрузка настроек из табли длительная, то как быть. В следующем потоке делать?
Суть не в этом, а в том, что сообщения (строками) для формы кидаешь-же сообщениями, что верно.
Так и это (применение настроек) нужно делать подобным образом.

Яж потому и спрашивал, как форма узнает, что поток отработал?
Тут же получается, что поток работает с базой параллельно с формой...
...
Рейтинг: 0 / 0
22.05.2017, 15:42
    #39457474
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: коннект в потоке
Дока если загрузка настроек из табли длительная, то как быть.Загрузить в буфер, отдать буфер основному потоку и там применить
...
Рейтинг: 0 / 0
22.05.2017, 15:51
    #39457486
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: коннект в потоке
_Vasilisk_Загрузить в буфер, отдать буфер основному потоку и там применить
а как это технически выглядит, можно хотя бы схематично?
wadmanТут же получается, что поток работает с базой параллельно с формой...
хм.... а я и не подумал.

Т.е., мне теперь в потоке каждый параметр вычитывать из табли и перегонять по одному сообщению в основную форму что ли? А нельзя их как-то массивом передать?
...
Рейтинг: 0 / 0
22.05.2017, 15:53
    #39457493
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: коннект в потоке
ДокА нельзя их как-то массивом передать?
Хоть через TStringList (это один вариантов "буфера", что предложил _Vasilisk_).
...
Рейтинг: 0 / 0
22.05.2017, 16:25
    #39457527
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: коннект в потоке
закомментил
Код: pascal
1.
if FrmMain.DBase_main.Connected then FrmMain.SetAppSettings;


вроде валиться перестала. Щас буду думать, как параметры передавать: столбиком или в строчку :)
...
Рейтинг: 0 / 0
22.05.2017, 16:26
    #39457528
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: коннект в потоке
wadman,

кстати, а какова максимальная длина строки, которую можно через NewString передать?
...
Рейтинг: 0 / 0
22.05.2017, 16:36
    #39457536
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: коннект в потоке
Доккстати, а какова максимальная длина строки, которую можно через NewString передать?
С моей стороны нет ограничений, все на уровне ОС/языка по свободной памяти и строкам.
http://wiki.freepascal.org/Character_and_string_types#AnsiString тут и ниже.
...
Рейтинг: 0 / 0
22.05.2017, 17:03
    #39457557
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: коннект в потоке
Док,

отладчик, конечно, не супер. но ограниченно поковырять можно, пробуй.

авторВряд-ли, т.к. поток не компонент. Его не указать владельцем (чтоб он всех своих за собой "забрал").

можно компонентную обёртку всунуть вместо чистого потока.
...
Рейтинг: 0 / 0
22.05.2017, 17:10
    #39457565
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: коннект в потоке
_Vasilisk_2. Если несколько потоков создают коннекты, то эта процедура должна быть синхронизирована единым мьютексом
3. Пункт 2 распространяется на весь процесс. И если коннекты создаются в разных dll, то также должен использоваться единый мьютекс
Если я не ошибаюсь, то такая особенность (необходимость синхронизации вызова isc_attach_database, т.е. TIBDatabase.Connected := True) была (что касается Firebird) до версии 3.0. А сейчас уже исправили (в fbclient.dll/so) это дело.
...
Рейтинг: 0 / 0
22.05.2017, 17:15
    #39457573
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lazarus: коннект в потоке
makhaonможно компонентную обёртку всунуть вместо чистого потока.
Уже предлагал много раз. :( ладно хоть не на асме клепает.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Lazarus: коннект в потоке / 25 сообщений из 125, страница 1 из 5
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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