powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / IBEvents в консольном приложении
8 сообщений из 8, страница 1 из 1
IBEvents в консольном приложении
    #39695266
genok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
делаю веб-сервис, для отладки параллельно сделал проект-консоль
так вот, если запущен сервис, то события от БД отрабатывают. А если консоль - то нет.
Все остальное, связанное с БД, работает без отличий.

подскажите, куда копать? насколько понимаю, как-то надо заставить приложение опрашивать компонент IBEvents на предмет новых событий?
стартует приложение стандартно:
Код: 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.
procedure RunServer;
begin
  WriteLog(Format('Starting HTTPS Server or port %d', [APort]),0);
  LServer := TIdHTTPWebBrokerBridge.Create(nil);
  try
    LServer.DefaultPort := APort;
    LServer.Active := True;
    Writeln('Press ESC to stop the server');

    WriteLog('Creating DataModule',0);
    DM:= TDM.Create(nil);
    DM.FIB.DBName:=DBName+':'+DBPath;
    DM.FIB.Open(false);
    case DM.FIB.Connected of
      true: WriteLog('Подключение к базе данных - OK',0);
     false: WriteLog('Подключение к базе данных - ошибка',0);
    end;

    LHandle := GetStdHandle(STD_INPUT_HANDLE);
    while True do
    begin
      Win32Check(ReadConsoleInput(LHandle, LInputRecord, 1, LEvent));
      if (LInputRecord.EventType = KEY_EVENT) and
      LInputRecord.Event.KeyEvent.bKeyDown and
      (LInputRecord.Event.KeyEvent.wVirtualKeyCode = VK_ESCAPE) then
        break;
    end;
  finally
    if DM.FIB.Connected then DM.FIB.CloseDataSets;
    LServer.Free;
    LGetSSLPassword.Free;
  end;
end;

begin
  try
  if WebRequestHandler <> nil then
    WebRequestHandler.WebModuleClass := WebModuleClass;
    RunServer;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end



предполагаю, что-то в цикл "while True do" надо вставить, а что - не соображу
...
Рейтинг: 0 / 0
IBEvents в консольном приложении
    #39695341
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
genok,

Они отрабатывают, просто зависают на вызове TThread.Synchronize, который глючит.Выход - переделать компоненты, убрав оттуда Synchronize, который подведет еще не раз.
...
Рейтинг: 0 / 0
IBEvents в консольном приложении
    #39695344
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
genokчто-то в цикл "while True do"
Ну можешь вставить туда CheckSynchronize. Тггда может срабатывать иногда случайно.
...
Рейтинг: 0 / 0
IBEvents в консольном приложении
    #39695392
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опрос событий крутится в отдельном потоке, а чтобы не грузить юзера премудростями, вызов коллбэка выполняется через Synchronize в контексте главного потока. Application отрабатывает его сама, а в консоли цикла выборки сообщений нет. Так что CheckSynchronize твое спасение.
...
Рейтинг: 0 / 0
IBEvents в консольном приложении
    #39696058
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Надеюсь, по теме :)

я делал так
Код: 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.
type
  TEventActions= class
  public
    class procedure FDAlerterAlert(ASender: TFDCustomEventAlerter;
      const AEventName: string; const AArgument: Variant);
  end;

class procedure TEventActions.FDAlerterAlert(ASender: TFDCustomEventAlerter;
  const AEventName: string; const AArgument: Variant);
begin
  //
  if AEventName = 'CO...' then
  begin
...
  end;

end;

...
  FDAlerter := TFDEventAlerter.Create(nil);
  FDAlerter.Connection := FDConn;
  FDAlerter.Names.Add('CONSTRUCTRTF');
  FDAlerter.OnAlert := TEventActions.FDAlerterAlert;
  FDAlerter.Options.Kind := 'Events';
  FDAlerter.Options.Synchronize := False;
  
  FDAlerter.Register;
  FDAlerter.Active := True;


Это правда для FireDac, но без разницы имхо. Работает вроде )
...
Рейтинг: 0 / 0
IBEvents в консольном приложении
    #39696747
genok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DevillioЭто правда для FireDac, но без разницы имхо. Работает вроде )

именно в консоли работает?
вот ранее предложенный CheckSynchronize в консоли реально срабатывает,
а предложенное тобой имхо не для консольного приложения
...
Рейтинг: 0 / 0
IBEvents в консольном приложении
    #39696978
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
genok, реальней реального работает )
...
Рейтинг: 0 / 0
IBEvents в консольном приложении
    #39697129
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кмк, там вся магия кроется в FDAlerter.Options.Synchronize := False;
То есть для сабжа толку в примере особого нет
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / IBEvents в консольном приложении
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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