Конференция "Базы" » Зависает программа при использовании EventAlerter [D7, Firebird]
 
  • akss © (08.12.08 15:43) [0]
    Такой вопрос - не у кого не возникало проблем при регистрации событий
    в TSIBfibEventAlerter? У меня при регистрации события в
    TSIBfibEventAlerter иногда зависает программа(иногда потом развисает
    но чаще нет), частота зависания примерно 1 к 4 или к 3 примерно. Делаю
    всё по примеру FibPlus5 и при этом в примере с тестовой базой всё в
    порядке, но когда я и его подключаю к рабочей только для прослушки
    событий, то и он зависает!!! мож кто сталкивался с этим багом.

    Заметил что зависания появляются чаще если количество подключений к БД
    увеличивается(т.е С утра пока не кто не работает зависает 1 раз
    примерно за 7-10 запусков, а днём почти каждый второй запуск приводит
    к зависанию, или даже чаще)

    Нашёл конкретное место зависания в модуле IB_Intf это функция


    function TIBClientLibrary.isc_que_events(status_vector: PISC_STATUS;
    db_handle: PISC_DB_HANDLE; event_id: PISC_LONG; length: Short;
    event_buffer: PChar; event_function: TISC_CALLBACK;
    event_function_arg: PVoid): ISC_STATUS;
    begin
    if Assigned(Fisc_que_events) then
    Result:= Fisc_que_events(status_vector, db_handle,event_id,
    length, event_buffer, event_function, event_function_arg
    )
    else
    raise
    EAPICallException.Create(Format(SCantFindApiProc,
    ['isc_que_events',FLibraryName]));
    end;



    и на строчке


    Result:= Fisc_que_events(status_vector, db_handle,event_id,
    length, event_buffer, event_function, event_function_arg
    )



    происходит зависание.
    Как я понял в этот момент происходит регистрация события как объекта
    (но если честно мне ваще не понятно чё здесь происходит), но если
    данная процедура не возвратит результат, то отлавливаться события не
    будут.
    Подскажите мне, пожалуйста, у кого возникала уже подобная проблема.

    Delphi7, Firebird 2.0, FibPlus5
  • Сергей М. © (08.12.08 15:49) [1]

    > этот момент происходит регистрация события как объекта


    В каком потоке ?
  • Сергей М. © (08.12.08 15:49) [2]

    > этот момент происходит регистрация события как объекта


    В каком потоке ?
  • akss © (08.12.08 16:05) [3]

    > В каком потоке ?


    Это происходит не в потоке, это при вызове метода  FIBEvent.RegisterEvents;
    он тупо иногда зависает (вернее часто).
  • Сергей М. © (08.12.08 16:08) [4]

    > Это происходит не в потоке


    В Win32 ничто не может происходить "не в потоке".


    > при вызове метода  FIBEvent.RegisterEvents


    В каком потоке ?
  • akss © (08.12.08 16:23) [5]
    я что-то  не совсем понял ну ладно, опишу подробнее:
    При запуске проекта на OnCreate формы происходит соединение с БД, на событие
    AfterConnect


    у
    TpFIBDatabase


    происходит добавление событий в список событий у компонента
    TSIBfibEventAlerter


    FIBEvent.Events.Add('event1');


    после того как все события, которые необходимо прослушивать от сервера, добавлены, происходит их регистрация для активации прослушки. Вроде так.
  • Сергей М. © (08.12.08 16:32) [6]
    Значит в основном потоке.

    У тебя, похоже, проблема с сетевыми настройками.
  • akss © (08.12.08 22:36) [7]
    С настройками всё в порядке, ведь программа работает отлично когда я не регестрирую события, просто тогда они не отлавливаются и не запускается их обработка(((
  • Сергей М. © (09.12.08 08:32) [8]

    > С настройками всё в порядке


    Ну тогда тряси бубен.
    Мое хо неизменно - следует внимательно изучить сетевую среду, в которой функционирует сервер и клиент.
    Можешь хотя бы ради эксперимента изменить способ подключения (TCP/IP, NetBIOS, IPX/SPX, MMF для локальной среды) - наверняка ситуация радикально изменится.
  • akss © (09.12.08 11:35) [9]
    Спасибо посмотрю, а ты говорил про


    > В каком потоке ?


    ка лучше в основном или в отдельном потоке производить регестрацию - раз уж ты спросил в каком у меня, скажи как лучше и как ты делаешь :-), да и какие вообще есть подводные камни в использовании событий БД - в компонентах FibPlus5
  • Сергей М. © (09.12.08 11:45) [10]

    >
    > ка лучше в основном или в отдельном потоке производить регестрацию


    По барабану.
    Потоки нельзя равнивать по критерию "лучшести".


    > какие вообще есть подводные камни в использовании событий
    > БД - в компонентах FibPlus5


    Надо смотреть исх-ки.
    В IBEvents, например, подписка на события осущ-ся в доп.потоке, а нотификация о событиях осущ-ся с использованием TThread.Synchronize, со всеми вытекающими из этого последствиями.
  • akss © (09.12.08 11:54) [11]
    Спасибо посмотрю, а ты говорил про


    > В каком потоке ?


    ка лучше в основном или в отдельном потоке производить регестрацию - раз уж ты спросил в каком у меня, скажи как лучше и как ты делаешь :-), да и какие вообще есть подводные камни в использовании событий БД - в компонентах FibPlus5
  • akss © (09.12.08 11:56) [12]
    Ещё раз спасибо (сори за мусор)
  • Dimitry Sibiryakov (09.12.08 21:05) [13]
    То, что ты видишь "зависание" на isc_que_event - ничего не значит, поскольку примерно в это время асинхронно приходит первое извещение о текущем состоянии счётчиков. Соответственно - вызывается ast. Но ты этого не видишь, поскольку оно происходит в другом потоке. Что там эта ast делает у SIB алертера - мне не видно, да и неинтересно. А она может делать всё что взбрело в голову её автору, включая всякую фигню с критическими секциями и сообщениями.

    Моё резюме: если можешь обойтись в программе без эвентов - обойдись. Поскольку ни один компонент, который я видел, не работает с ними нормально. И моё (отнюдь не скромное) мнение - такой (универсальный) компонент вообще невозможен именно вследствие невыполнимого требования универсальности.
  • akss © (10.12.08 08:48) [14]
    А что насчёт портов??? в Firebird кажися нужно открывать для событий отдельный порт???
    Да и если кто знает что нужно править в исходниках то скажите плиз  или у кого то уже есть правленные дайте ПЛИЗ
  • Сергей М. © (10.12.08 10:01) [15]

    > что насчёт портов?


    Для рассуждений о портах необходимо сначала обозначить протокол, по которому клиент взаимодействует с сервером.
  • akss © (10.12.08 10:53) [16]
    tcp/ip
  • Сергей М. © (10.12.08 12:26) [17]

    > Firebird кажися нужно открывать для событий отдельный порт?


    Да. На стороне сервера.
    Соответственно требуется должная доп.настройка межсетевых экранов/брендмауеров/файрволов (если таковые имеются) на обеих сторонах потенциального соединения.
  • PEAKTOP © (11.12.08 15:41) [18]
    > Да и если кто знает что нужно править в исходниках то скажите плиз

    В исходниках Firebird ? ню-ню...

     или у кого то уже есть правленные дайте ПЛИЗ

    Даже у меня править сырцы Firebird (несмотря на Automated snapshots builds на моем сервере) рука не поднимается... :)
  • Сергей М. © (11.12.08 16:14) [19]

    > править сырцы Firebird.. рука не поднимается


    Да собссно ничего страшного в этом нет, если интерес искл-но спортивный)
    По кр.мере FB 1.0 я успешно правил и собирал. Но тогда у меня был далеко не спортивный интерес)
 
Конференция "Базы" » Зависает программа при использовании EventAlerter [D7, Firebird]
Есть новые Нет новых   [134477   +39][b:0][p:0.001]