• 0
zekelive

Переподключение к серверу (DataSnape)

Вопрос

Кто работал с DS, подскажите, как реализовать автоматическое переподключение к серверу после тайм-аута? Пробовал кучу вариантов, но не могу отловить момент отключения даже, да и тайм-аут не настраивается. Параметр есть, но реагировать на измененные значения не хочет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

7 ответов на этот вопрос

  • 0

эмм... а речь о переподключении к какому серваку?... от клиента к DS или от DS к какому нибудь серваку?

если от клиента к DS то у SQLSonnection есть свойство AfterDisconnect. Имхо, стоит избегать постоянного коннекшна, если конечно это возможно. У меня обычно по необходимости подымается коннешн и отрубается после завершения синхронизации.

если второй вариант ... то аналогичное свойство используемого компонента подключения

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

если рассуждать логически, нет никакого дисконнекта, есть отсутствие связи при попытке что-то передать

т.е. дисконнект это в основном - обработка ошибок при обмене

пытаемся вызывать что-то, ошибка - переподключение...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
39 минут назад, beklexx сказал:

эмм... а речь о переподключении к какому серваку?... от клиента к DS или от DS к какому нибудь серваку?

если от клиента к DS то у SQLSonnection есть свойство AfterDisconnect. Имхо, стоит избегать постоянного коннекшна, если конечно это возможно. У меня обычно по необходимости подымается коннешн и отрубается после завершения синхронизации.

если второй вариант ... то аналогичное свойство используемого компонента подключения

 

Да. Именно от клиента к DS. Ситуация такова, что пользователь пользовался программой, потом выключил экран и кинул в карман. Через 10 минут достает чтобы снова воспользоваться но клиентская программа уже отключилась от сервера. И приходится закрывать и снова оикрывать приложение. Как сделать так, чтобы при активации формы заново пооисходила процедура подключение ( как при первом запуске программы).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
26 минут назад, krapotkin сказал:

если рассуждать логически, нет никакого дисконнекта, есть отсутствие связи при попытке что-то передать

т.е. дисконнект это в основном - обработка ошибок при обмене

пытаемся вызывать что-то, ошибка - переподключение...

Согласен с вами, отсутствие связи. Как эту связь восстановить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

также как и в первый раз

if NOT(dm.SQLConnection1.Connected) then
  try
    dm.SQLConnection1.Connected:= True;
....

хотя если реально при отключении связи не происходит дисконнект, то 

if dm.SQLConnection1.Connected then dm.SQLConnection1.Connected:= False;
try
  dm.SQLConnection1.Connected:= True;
....

 

Изменено пользователем beklexx
Kitty понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

я обычно проверяю связь до сервака, прежде чем SQLConnection врубать... чем то типа:

function Tdm.CheckConnect: boolean;
var res: boolean;
begin
  try
    IdTCPClient1.ReadTimeout:= 10000;
    IdTCPClient1.ConnectTimeout:= 10000;
    IdTCPClient1.Connect;
    IdTCPClient1.Disconnect;
    res:=true;
  except
    res:=false;
  end;
  Result:= res;
end;

установив мои IdTCPClient1.Port и IdTCPClient1.Host

Изменено пользователем beklexx

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
47 минут назад, beklexx сказал:

также как и в первый раз


if NOT(dm.SQLConnection1.Connected) then
  try
    dm.SQLConnection1.Connected:= True;
....

хотя если реально при отключении связи не происходит дисконнект, то 


if dm.SQLConnection1.Connected then dm.SQLConnection1.Connected:= False;
try
  dm.SQLConnection1.Connected:= True;
....

 

Что то птдобное пробовал уже, но попробую Ваш вариант. Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Похожие публикации

    • Автор: Anasazi
      Всем привет. Есть приложение под Android, используются 2 формы. Так вот при первом переключении есть заметная задержка (фриз). Четко чувствуется на всех устройствах. При следующих переключениях такого не наблюдается. Может быть кто-то сталкивался с такой проблемой, подскажите пожалуйста пути решения.
    • Автор: Рагим
      Доброго времени суток. Пишу мобильное приложение на Delphi Berlin. Добавил вибрацию при нажатии на кнопку. На Андроид 4.4.2 все работает нормально, на Андроид 6 при нажатии на кнопку приложение вылетает. Проблема точно в вибрации, так как при отсутствии вибрации все работает нормально. В качестве процедуры вибрации использую следующий код:
      procedure Vibr; //Процедура вибрации var   VibratorObj: JObject;   Vibrator: JVibrator; begin   VibratorObj := SharedActivity.getSystemService(TJActivity.JavaClass.VIBRATOR_SERVICE);   Vibrator := TJVibrator.Wrap((VibratorObj as ILocalObject).GetObjectID);   if Vibrator.hasVibrator() then     Vibrator.vibrate(200); end;  
      Как по Вашему, в чем может быть причина?
    • Автор: rakhmet
      Что это (alert, message, notify, etc.)? И как этим можно воспользоваться на Android?

    • Автор: gresaggr
      Как избежать повторных нажатий/ закликиваний на кнопку?
      Имеется следующий код:
      procedure Tfm.ButtonPrevCardClick(Sender: TObject);
      begin
        ButtonPrevCard.Enabled := false;
        Application.ProcessMessages;

       // здесь код по смене карты + пауза в 2 секунды

        ButtonPrevCard.Enabled := true;
        Application.ProcessMessages;
      end;
      Под Windows повторных нажатий/закликиваний при этом не происходит.
      А под Андроид, если пользователь быстро подряд нажал несколько раз, то сработает также несколько раз.
       
    • Автор: Pax Beach
      Я использую принудительную ориентацию экрана на Android устройстве.
      Что это означает?
      Когда открывается приложение, экран переворачивается в то положение, которое я устанавливаю по умолчанию, или которое было установлено в настройках приложения (состояние читается при запуске приложения).
      Приведу пример кода, как я его написал. Здесь что-то лишнее, что-то может стоит доработать.
      Есть две проблемы в примере:
      1. Чтобы изменить ориентацию экрана, приходится закрывать (уничтожать) приложение, а потом открывать заново.
      2. Когда стоит режим ландшафт, то срабатывает автоматический переворот экрана по сенсору, когда поворачиваешь экран на 180 градусов. А когда стоит режим портрет, автоматически экран не переворачивается.
       
      В настройках проекта так:

       
      В Object inspector для главной формы так:

       
      В модуле проекта вот так:
      begin Application.Initialize; TAndroidHelper.Activity.getWindow.addFlags (TJWindowManager_LayoutParams.JavaClass.FLAG_KEEP_SCREEN_ON); Application.FormFactor.Orientations := [TFormOrientation.Portrait, TFormOrientation.InvertedPortrait, TFormOrientation.Landscape, TFormOrientation.InvertedLandscape]; Application.CreateForm(TDM, DM); Application.CreateForm(TfmMain, fmMain); VKAutoShowMode := TVKAutoShowMode.Always; Application.Run; end.  
      В модуле главной формы:
      procedure TfmMain.FormShow(Sender: TObject); begin if DM.setOrientation(TAndroidHelper.Activity) then Invalidate; end;  
      В дата-модуле вот так:
      function TDM.setOrientation(Activity: JActivity): boolean; var orient: Integer; begin result := False; if DM.GetSettingsBoolean('IsOrientationLandshaft', true) then orient := TJActivityInfo.JavaClass.SCREEN_ORIENTATION_SENSOR_LANDSCAPE else orient := TJActivityInfo.JavaClass.SCREEN_ORIENTATION_SENSOR_PORTRAIT; try if Activity.getRequestedOrientation <> orient then begin Activity.setRequestedOrientation(orient); result := true; end; except result := False; end; end;  
       
    • Автор: dmokrushin123
      На устройство с IOS сообщения приходят и через Kinvey и через FCM (Firebase Cloud Messaging).
      На Android возвращается Token, сами уведомления НЕ приходят. 
       
       
       
       
       
       
    • Автор: notricky
      Почему-то код, исправно работающий для WIN, не работает на ANDROID.
      procedure AssignEventToComponent(C: TComponent; MethodName: String; const Evt: TNotifyEvent; OnlyIfNil: boolean = true); var M: TMethod; begin M := GetMethodProp(C,MethodName); if not OnlyIfNil or (M.Code = nil) then begin TNotifyEvent(M) := Evt; SetMethodProp(C,MethodName,M); end; end; Есть какие-то особенности работы TMethod для ANDROID?
    • Автор: lala4a
      Доброе время суток .
      Я только начал знакомится с потоками , не судите строго .
      Вот код . Смысл которого через отдельный поток загружать изображение с сервера .
      unit Unit5; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,iduri,idhttp, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Objects, FMX.Controls.Presentation, FMX.StdCtrls; type ThreadHTTP=class(TThread) private Stream:TMemoryStream; bmp:tbitmap; url:string; public constructor Create(abmp:tbitmap; aurl: String); procedure Execute;override; // procedure ShowResult; end; type TForm5 = class(TForm) Button1: TButton; Image1: TImage; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } procedure getpic(pic: string; img: Tbitmap); end; var Form5: TForm5; implementation {$R *.fmx} constructor ThreadHTTP.Create(abmp:tbitmap;aurl:string); begin inherited Create(false); bmp := abmp; url:=aurl; end; procedure ThreadHTTP.Execute; var j:integer; idhttp : TIdHTTP; ms:tmemorystream; png:tbitmap; begin ms := TMemoryStream.Create; IdHTTP := TIdHTTP.Create(nil); url:=TIdURI.URLEncode(url); try idhttp.Get(url,ms); ms.Position := 0; finally bmp.LoadFromStream(ms); idhttp.Free; ms.Free; end; end; procedure TForm5.Button1Click(Sender: TObject); begin getpic('krovat1',form5.Image1.Bitmap); end; procedure TForm5.getpic(pic: string; img: Tbitmap); var zapros:string; idhttp:tidhttp; MyHTTP:ThreadHTTP; begin zapros:='http://127.0.0.1/getimage_'+pic; MyHTTP:=ThreadHTTP.Create(img,zapros); MyHTTP.FreeOnTerminate := true; MyHTTP.resume; end; end. Код корявый , но работает в win32 .  В Android ничего не происходит .
      Помогите разобраться , пожалуйста .
       
    • Автор: ivadimos
      Пытаюсь опубликовать приложение в Гугл маркет.
      Присылают ответ на почту.

      OpenSSL
      The vulnerabilities were addressed in OpenSSL 1.02f/1.01r. To confirm your OpenSSL version, you can do a grep search for:
      $ unzip -p YourApp.apk | strings | grep "OpenSSL"
      You can find more information and next steps in this Google Help Center article.
      Но ведь я не использую никакой работы с сетью и т.д, только firedac и sqlite
    • Автор: Rusland
      Имеется форма с Edit, в котором набран IP-адрес 192.168.1.12
      Если попробовать долгим тапом выделить весь текст (для копирования), то выделяется только какая-то одна цифра. Весь текст никак не выделить. Тоже самое будет, если вместо точек поставить любые другие знаки препинания или пробел. Как решить эту проблему?
       
  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу