Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / IBEvents в консольном приложении / 8 сообщений из 8, страница 1 из 1
30.08.2018, 04:29
    #39695266
genok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBEvents в консольном приложении
делаю веб-сервис, для отладки параллельно сделал проект-консоль
так вот, если запущен сервис, то события от БД отрабатывают. А если консоль - то нет.
Все остальное, связанное с БД, работает без отличий.

подскажите, куда копать? насколько понимаю, как-то надо заставить приложение опрашивать компонент 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
30.08.2018, 09:25
    #39695341
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBEvents в консольном приложении
genok,

Они отрабатывают, просто зависают на вызове TThread.Synchronize, который глючит.Выход - переделать компоненты, убрав оттуда Synchronize, который подведет еще не раз.
...
Рейтинг: 0 / 0
30.08.2018, 09:27
    #39695344
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBEvents в консольном приложении
genokчто-то в цикл "while True do"
Ну можешь вставить туда CheckSynchronize. Тггда может срабатывать иногда случайно.
...
Рейтинг: 0 / 0
30.08.2018, 10:54
    #39695392
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBEvents в консольном приложении
Опрос событий крутится в отдельном потоке, а чтобы не грузить юзера премудростями, вызов коллбэка выполняется через Synchronize в контексте главного потока. Application отрабатывает его сама, а в консоли цикла выборки сообщений нет. Так что CheckSynchronize твое спасение.
...
Рейтинг: 0 / 0
31.08.2018, 11:17
    #39696058
Devillio
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
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.
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
02.09.2018, 02:53
    #39696747
genok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
IBEvents в консольном приложении
DevillioЭто правда для FireDac, но без разницы имхо. Работает вроде )

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


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