powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Зависание регистрации событий по xnet протоколу
25 сообщений из 40, страница 1 из 2
Зависание регистрации событий по xnet протоколу
    #40044494
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такой код
Код: 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.
    FEvents: PByte;
    FResults: PByte;


constructor TEventBlock.Create(AOwner: TMyIBEvents; AOffset, ACount: Integer);
var
  Li: Integer;
  LEventStrs: array[0..IB_MAX_EVENT_BLOCK - 1] of AnsiString;
  LEvents: array[0..IB_MAX_EVENT_BLOCK - 1] of PByte;
begin
  inherited Create;
  FOwner := AOwner;
  FInitEvent := CreateEvent(nil, False, False, nil);
  try
    for Li := 0 to FCount - 1 do begin
      LEventStrs[Li] := AnsiString(FOwner.Events[AOffset + Li]);
      LEvents[Li] := PByte(LEventStrs[Li]);
    end;
    FLen := FOwner.GDSLibrary.isc_event_block(
      FEvents,
      FResults,
      FCount,
      LEvents
    );
    FillChar(FResults^, FLen, 0);
    QueueEvent;
    WaitForSingleObject(FInitEvent, INFINITE);
    QueueEvent;
  finally
    CloseHandle(FInitEvent);
  end;
end;

procedure TEventBlock.QueueEvent;
begin
  FOwner.Database.Call(
    FOwner.GDSLibrary.isc_que_events(
      StatusVector,
      @FOwner.Database.Handle,
      @FID,
      FLen,
      FEvents,
      @EventCallback,
      PVoid(Self)
    ),
    True
  );
end;

procedure EventCallback(APtr: Pointer; ALength: Short; AUpdated: PAnsiChar); cdecl;
begin
   ...........
  SetEvent(FInitEvent);
end;


Происходит зависание на выделенной строке, т.к. не вызывается EventCallback. Вообще. Это происходит при коннекте по xnet. Если я заменяю xnet:// на localhost: все работает.

Если после зависания остановить службу Firebird, то EventCallback вызывается с параметрами (APtr, 0, nil);

Версия сервераServer Version: WI-V3.0.7.33374 Firebird 3.0
Server Implementation: Firebird/Windows/AMD/Intel/x64клиент 32 битный.

Где моя ошибка? Коду по работе с событиями уже много лет. Правда работал он только по TCP протоколу и с Interbase.

С уважением, Vasilisk
...
Рейтинг: 0 / 0
Зависание регистрации событий по xnet протоколу
    #40044524
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Где моя ошибка?

Как минимум - FillChar(FResult) там лишний. И есть подозрение, что клиент у тебя не той
системы, поскольку такой баг замечен в Interbase 7.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Зависание регистрации событий по xnet протоколу
    #40044537
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Как минимум - FillChar(FResult) там лишний
В смысле не нужен или вреден?
Dimitry Sibiryakov
. И есть подозрение, что клиент у тебя не той системы
Код: pascal
1.
2.
3.
4.
    LHandle := GetModuleHandle(PChar(FOwner.GDSLibrary.LibraryName));
    LName := GetModuleName(LHandle);
    GetProductVersion(LName, LMajor, LMinor, LBuild);
    MessageBox(0, PChar(Format('%s: %u.%u.%u', [LName, LMajor, LMinor, LBuild])), '', 0);

C:\WINDOWS\SYSTEM32\fbclient.dll: 3.0.7Да и послал бы меня клиент IB с xnet протоколом
...
Рейтинг: 0 / 0
Зависание регистрации событий по xnet протоколу
    #40044553
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Как минимум - FillChar(FResult) там лишний.
Убрал, ничего не изменилось
...
Рейтинг: 0 / 0
Зависание регистрации событий по xnet протоколу
    #40044558
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_В смысле не нужен или вреден?

Как минимум - не нужен. В зависимости от того как у тебя написал callback, может быть и
вреден. Event block имеет внутреннюю структуру, включающую в себя имена событий, и
обнулять его целиком чревато для функций, которым ты его потом будешь скармливать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Зависание регистрации событий по xnet протоколу
    #40044564
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Как минимум - не нужен. В зависимости от того как у тебя написал callback, может быть и вреден.
В коллбеке у меня так
Код: pascal
1.
2.
if AUpdated <> nil then begin
  Move(AUpdated^, FResults^, FLen);

Я не знаю откуда это пошло. Код довольно старый и писался для Interbase. Тут или копипаста откуда-то или обход какого-то бага. Уже не скажу.

Но сейчас проблема в том, что для xnet коллбек не вызывается вообще.
...
Рейтинг: 0 / 0
Зависание регистрации событий по xnet протоколу
    #40044575
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
del
...
Рейтинг: 0 / 0
Зависание регистрации событий по xnet протоколу
    #40044576
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Но сейчас проблема в том, что для xnet коллбек не вызывается вообще.

Теоретически это даже может быть правильным поведением: не произошло событие - не
вызывается коллбэк.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Зависание регистрации событий по xnet протоколу
    #40044577
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Теоретически это даже может быть правильным поведением: не произошло событие - не вызывается коллбэк.
Да. Но во первых всегда требовался двойной вызов isc_que_events на старте. И при возникновении события коллбек все равно не вызывается
...
Рейтинг: 0 / 0
Зависание регистрации событий по xnet протоколу
    #40044583
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Но во первых всегда требовался двойной вызов isc_que_events на старте.

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

_Vasilisk_И при возникновении события коллбек все равно не вызывается

И даже после второго события (поскольку у тебя там сразу идёт второе ожидание)?
Тогда это точно баг. Как и в случае с Interbase, мой ответ "не используйте xnet".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Зависание регистрации событий по xnet протоколу
    #40044595
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
И даже после второго события (поскольку у тебя там сразу идёт второе ожидание)?
Я в отладчике поставил брекпойнт в коллбеке. Коллбек не вызывается вообще. Три события послал. Более того, если убрать ожидание и сделать так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    FLen := FOwner.GDSLibrary.isc_event_block(
      {$IF IBX_Version < 19}@{$IFEND}
      FEvents,
      {$IF IBX_Version < 19}@{$IFEND}
      FResults,
      FCount,
      LEvents
    );
    FillChar(FResults^, FLen, 0);
    QueueEvent;
//    WaitForSingleObject(FInitEvent, INFINITE);
//    QueueEvent;

то зависания нет, что логично, но коллбек вызывается только при дисконнекте от базы. События игнорируются
Dimitry Sibiryakov
Тогда это точно баг.
90%, что он появился в 3.0.7.
Хотя вот сейчас проверили на другой машине тоже с 3.0.7, правда там сервер 32-х битный - все работает.

Я боюсь сейчас в трекер соваться, без точных условий повторения
Dimitry Sibiryakov
мой ответ "не используйте xnet".
Ну обещали же новый и хороший протокол
...
Рейтинг: 0 / 0
Зависание регистрации событий по xnet протоколу
    #40044597
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_90%, что он появился в 3.0.7.
Хотя вот сейчас проверили на другой машине тоже с 3.0.7, правда там сервер 32-х битный -
все работает.

Как я уже сказал, эта проблема впервые была замечена на IB7, то есть существует
вероятность, что этот баг старый и поселился ещё в локальном протоколе. А в xnet его
портировали не глядя.

_Vasilisk_Ну обещали же новый и хороший протокол

Он новый и хороший, но когда в нём починили колбэки на шифрование базы (и починили ли
вообще) - я не помню. Очевидно, колбэки событий провалились в ту же яму с багами.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Зависание регистрации событий по xnet протоколу
    #40044598
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

воспроизводимый пример есть ?
...
Рейтинг: 0 / 0
Зависание регистрации событий по xnet протоколу
    #40044606
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad
воспроизводимый пример есть ?
Могу написать. На Delphi можно или C only?
...
Рейтинг: 0 / 0
Зависание регистрации событий по xnet протоколу
    #40044632
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собрал тест на VC - работает.

Ушел сравнивать заголовки
...
Рейтинг: 0 / 0
Зависание регистрации событий по xnet протоколу
    #40044645
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
hvlad
воспроизводимый пример есть ?
Могу написать. На Delphi можно или C only?
На том, на чём воспроизводится :)
...
Рейтинг: 0 / 0
Зависание регистрации событий по xnet протоколу
    #40044668
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad
На том, на чём воспроизводится :)
Переписал тестовый пример с Си на Делфи - работает, зараза.

Завтра буду копать дальше.
...
Рейтинг: 0 / 0
Зависание регистрации событий по xnet протоколу
    #40045003
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Итак, воспроизводимый пример

Импорты
Код: 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.
const
  fbclient = 'fbclient.dll';

function isc_attach_database(status_vector            : PISC_STATUS;
                               db_name_length           : Short;
                               db_name                  : PByte;
                               db_handle                : PISC_DB_HANDLE;
                               parm_buffer_length	  : Short;
                               parm_buffer              : PByte): ISC_STATUS; stdcall; external fbclient;
function isc_detach_database(status_vector: PISC_STATUS; db_handle : PISC_DB_HANDLE): ISC_STATUS; stdcall; external fbclient;
function isc_print_status(AStatus: PISC_STATUS): ISC_STATUS; stdcall; external fbclient;
function isc_event_block(var EventBuffer : PByte; var ResultBuffer: PByte; IDCount: UShort;
  Event1, Event2, Event3, Event4, Event5, Event6, Event7, Event8, Event9,
  Event10, Event11, Event12, Event13, Event14, Event15: PByte): ISC_LONG; cdecl; external fbclient;
function isc_que_events(
       status_vector             : PISC_STATUS;
       db_handle                 : PISC_DB_HANDLE;
       event_id                  : PISC_LONG;
       length                    : Short;
       event_buffer              : PByte;
       event_function            : TISC_CALLBACK;
       event_function_arg        : PVoid): ISC_STATUS; stdcall; external fbclient;
procedure isc_event_counts(
       status_vector             : PUISC_LONG;
       buffer_length             : Short;
       event_buffer              : PByte;
       result_buffer             : PByte); stdcall; external fbclient;
function isc_cancel_events(status_vector            : PISC_STATUS;
                               db_handle                : PISC_DB_HANDLE;
                               event_id                 : PISC_LONG): ISC_STATUS; stdcall; external fbclient;


функция ConnectToDB
Код: 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.
threadvar
  status_vector: array[0..19] of ISC_STATUS;

function AddDPBVal(var ADPB: PByte; AValue: Byte): PByte; overload;
begin
  ADPB^ := AValue;
  Inc(ADPB);
  Result := ADPB;
end;

function AddDPBVal(var ADPB: PByte; AName: Byte; AValue: PAnsiChar): PByte; overload;
var
  LLen: Byte;
begin
  AddDPBVal(ADPB, AName);
  LLen := StrLen(AValue);
  AddDPBVal(ADPB, LLen);
  Move(AValue^, ADPB^, LLen);
  Inc(ADPB, LLen);
  Result := ADPB;
end;

function AddDPBVal(var ADPB: PByte; AName, AValue: Byte): PByte; overload;
begin
  AddDPBVal(ADPB, AName);
  AddDPBVal(ADPB, 1);
  AddDPBVal(ADPB, AValue);
  Result := ADPB;
end;

function IsFBError: Boolean;
begin
  Result := (status_vector[0] = 1) and (status_vector[1] <> 0);
end;

function CheckFBSuccess: Boolean;
begin
  if IsFBError then begin
    isc_print_status(@status_vector);
    Result := False;
  end else
    Result := True;
end;

function ConnectToDB(AName: PAnsiChar): TISC_DB_HANDLE;
var
  LDPBBuf: array[Byte] of Byte;
  LDPB: PByte;
  LDPBLength: SmallInt;
begin
  LDPB := @LDPBBuf[0];
  AddDPBVal(LDPB, isc_dpb_version1);

  AddDPBVal(LDPB, isc_dpb_user_name, 'SYSDBA');
  AddDPBVal(LDPB, isc_dpb_password, 'masterkey');

  LDPBLength := NativeUInt(LDPB) - NativeUInt(@LDPBBuf[0]);
  Result := nil;

  isc_attach_database(@status_vector[0], StrLen(AName), PByte(AName), @Result, LDPBLength, @LDPBBuf[0]);
  if IsFBError then
    Result := nil;
end;


EventCallback
Код: 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.
type
  TEventData = record
    Event: PByte;
    Result: PByte;
    hEvent: THandle;
  end;
  PEventData = ^TEventData;

procedure EventCallback(AData: Pointer; ALength: Word; AUpdated: PByte); cdecl;
var
  LData: PEventData;
begin
  if (ALength = 0) or (AUpdated = nil) then
    Exit;
  LData := AData;
  Move(AUpdated^, LData^.Result^, ALength);
  isc_event_counts(@status_vector[0], ALength, LData^.Event, LData^.Result);
  if LData^.hEvent <> 0 then begin
    SetEvent(LData^.hEvent);
    Exit;
  end;
  if status_vector[0] <> 0 then
    MessageBox(0, 'Event', '', 0);
end;


функция WaitEvent
Код: 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.
function WaitEvent(ADB: TISC_DB_HANDLE; const AEvents: array of PAnsiChar): ISC_LONG;
var
  LData: PEventData;
  LLen: SmallInt;
  LEvents: array of PByte;
begin
  LData := VirtualAlloc(nil, SizeOf(LData^), MEM_COMMIT, PAGE_READWRITE);
  LLen := Length(AEvents);
  SetLength(LEvents, LLen);
  Move(AEvents[0], LEvents[0], LLen * SizeOf(AEvents[0]));
  LLen := isc_event_block(LData^.Event, LData^.Result, Length(AEvents),
    LEvents[0], LEvents[1], LEvents[2], LEvents[3], LEvents[4], LEvents[5],
    LEvents[6], LEvents[7], LEvents[8], LEvents[9], LEvents[10], LEvents[11],
    LEvents[12], LEvents[13], LEvents[14]
  );
  LData^.hEvent := CreateEvent(nil, False, False, nil);
  isc_que_events(@status_vector[0], @ADB, @Result, LLen, LData^.event, @EventCallback, PVoid(LData));
  if not CheckFBSuccess then
    Exit(0);
  WaitForSingleObject(LData^.hEvent, INFINITE);
  CloseHandle(LData^.hEvent);
  LData^.hEvent := 0;
  isc_que_events(@status_vector[0], @ADB, @Result, LLen, LData^.event, @EventCallback, PVoid(LData));
  if not CheckFBSuccess then
    Result := 0;
end;


Тестирующая функция
Код: sql
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.
const
  CEventNames: array[0..7] of AnsiString = (
    'EVENT_UPD_SUBS',
    'EVENT_POSTS_AU',
    'EVENT_POSTS_AU_NEW',
    'EVENT_PLAN_REPORT',
    'EVENT_TSK_COMMAND',
    'INS_REGISTRATION_EVENT',
    'EVENT_QUEUE_CFG',
    'EVENT_QUEUE_DELTA_CFG'
  );

procedure TestApi;
var
  LDB: TISC_DB_HANDLE;
  LEvent: ISC_LONG;
  Li: Integer;
  LData: array[0..Length(CEventNames) - 1] of PAnsiChar;
begin
  LDB := ConnectToDB('xnet://D:\DB\Temp.fdb');
  if not CheckFBSuccess then
    Exit;
  for Li := 0 to Length(CEventNames) - 1 do
    LData[Li] := PAnsiChar(CEventNames[Li]);
  LEvent := WaitEvent(LDB, LData);
  Sleep(1000);
  isc_cancel_events(@status_vector[0], @LDB, @LEvent);
  isc_detach_database(@status_vector[0], @LDB);
end;


вызов всего этого
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  Unit4 in 'Unit4.pas';

begin
  try
    TestApi;
  except
    on E: Exception do
      Writeln(E.Message);
  end;
  Write('Press <ENTER>...');
  Readln;
end.


Зависания происходят в функции WaitEvent на выделенной строке

Весь проект в аттаче.

Примечания:
1. Иногда, один раз из 20-30 запусков после первого вызова isc_que_events коллбек вызывается и зависания не происходит
2. Имена событий должны быть строго такими. При уменьшении числа событий или именах Test1 .. Test8 все работает
3. Этот же код с этими же событиями замечательно работает в Visual Studio
...
Рейтинг: 0 / 0
Зависание регистрации событий по xnet протоколу
    #40045012
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

exe давай, мне нечем это компилировать.
И не нужно зашивать имя БД в код, неужели так трудно его с ком. строки взять ?
...
Рейтинг: 0 / 0
Зависание регистрации событий по xnet протоколу
    #40045020
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad
exe давай, мне нечем это компилировать.
Пока отбой. Без отладчика эта штука начала стабильно работать. Буду еще искать. Понять бы куда смотреть.

Какая-то явная беда в синхронизации потоков

hvlad
неужели так трудно его с ком. строки взять ?
Не трудно. Уже переделал.
...
Рейтинг: 0 / 0
Зависание регистрации событий по xnet протоколу
    #40045021
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

пока что мне совсем не нравится вызов isc_event_block с неопределёнными значениями LEvents[8] - LEvents[14].
...
Рейтинг: 0 / 0
Зависание регистрации событий по xnet протоколу
    #40045023
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вместо всей этой байды с ивентом можно просто первым вызвать isc_wait_event(). Всё то же
самое, но "под ковриком".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Зависание регистрации событий по xnet протоколу
    #40045098
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad
пока что мне совсем не нравится вызов isc_event_block с неопределёнными значениями LEvents[8] - LEvents[14].
Маловероятно, но допустим
Dimitry Sibiryakov
Вместо всей этой байды с ивентом можно просто первым вызвать isc_wait_event().
Спасибо. Второй раз ты мне советуешь эту функцию и второй раз я не могу ее найти. Потому что называется она isc_wait_ for _event

С этой функцией вроде получилось стабильно завешивать. Итак, обновленный код WaitEvent
Код: 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.
function WaitEvent(ADB: TISC_DB_HANDLE; const AEvents: array of PAnsiChar): ISC_LONG;
var
  LData: PEventData;
  LLen: SmallInt;
  LEvents: array of PByte;
begin
  LData := VirtualAlloc(nil, SizeOf(LData^), MEM_COMMIT, PAGE_READWRITE);
  LLen := Length(AEvents);
  if LLen > 15 then
    LLen := 15;
  SetLength(LEvents, 15);
  FillChar(LEvents[0], Length(LEvents) * SizeOf(AEvents[0]), 0);
  Move(AEvents[0], LEvents[0], LLen * SizeOf(AEvents[0]));
  LLen := isc_event_block(LData^.Event, LData^.Result, Length(AEvents),
    LEvents[0], LEvents[1], LEvents[2], LEvents[3], LEvents[4], LEvents[5],
    LEvents[6], LEvents[7], LEvents[8], LEvents[9], LEvents[10], LEvents[11],
    LEvents[12], LEvents[13], LEvents[14]
  );
  Writeln('Before isc_wait_for_event');
  isc_wait_for_event(@status_vector[0], @ADB, LLen, LData^.event, LData^.Result);
  Writeln('After isc_wait_for_event');
  if not CheckFBSuccess then
    Result := 0;
  isc_event_counts(@status_vector[0], LLen, LData^.Event, LData^.Result);
  isc_que_events(@status_vector[0], @ADB, @Result, LLen, LData^.event, @EventCallback, PVoid(LData));
  if not CheckFBSuccess then
    Result := 0;
end;


Вот откомпилированный файл

Запускать
Код: powershell
1.
project1.exe xnet://...



Блин! Решил продублировать код в VS. Теперь он без дебаггера опять перестал зависать. При том, что я его не трогал
...
Рейтинг: 0 / 0
Зависание регистрации событий по xnet протоколу
    #40045104
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отладчик, в момент зависания на isc_wait_for_event показывает следующие стеки:

Главный поток
:7736171c ntdll.NtWaitForSingleObject + 0xc
:762404e2 KERNELBASE.WaitForSingleObject + 0x12
:6b6c0470 ; C:\WINDOWS\SysWOW64\fbclient.dll
:02b90b8c
Два дополнительных потока, которые появились после вызова isc_wait_for_event
:7736171c ntdll.NtWaitForSingleObject + 0xc
:762404e2 KERNELBASE.WaitForSingleObject + 0x12
:6b6e468a ; C:\WINDOWS\SysWOW64\fbclient.dll
Второй поток без стека, но остановлен на функции ntdll.RtlUserThreadStart

fbclient.dll версии 3.0.7.33374 загружен по адресу 0x6B61000

Максимально близко к адресу 0x6b6e468a находится функция isc_start_transaction по адресу 0x6B6930A0
...
Рейтинг: 0 / 0
Зависание регистрации событий по xnet протоколу
    #40045138
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Второй поток
Это порождение дебаггера. Можно не обращать внимания
...
Рейтинг: 0 / 0
25 сообщений из 40, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Зависание регистрации событий по xnet протоколу
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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