![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Непонятное поведение клиента при потере связи с сервером [Yaffil]
VID © (2003-10-16 01:01:00)
Раньше я наблюдал эту проблему при работе клиента на платформе win9x. Я думал проблема именно в этой платформе, но нет! Сейчас Win2k а проблема осталась. Дело вот в чём: клиент приконнектился к серверу. А у меня в программе клиента, предумотрена система реконнекта. в случае если сервер вылетает. Итак, коннект прошёл успешно. Теперь я выключаю сервер, (сервер и клиент находятся на разных машинах, когда они находятся на одной - то проблемы не возникает), и клиент через некоторое время понимает что он уже "не при делах" , и начинает реконнект. Ну там пишутся соотв. надписи у меня типа "Попытка восстановления связи...", и всё... клиент намертво и надолго зависает! Через минут 5 он вдруг оживает, вылетает сообщение что Succsesful connection can not be established потому что там что то с сервером и всё такое (хотя почему ваще вылетает это сообщение, ведь не должно... или должно ? Подвопрос: как избежать появление этого сообщения, оно крайне некстати?), и короче после появления этого сообщения замеченоч
то какие то клиенты ещё позволяют нажать кнопку ОК в этом сообщении, и в принципе удачно реконнектятся (к тому времени сервер уже загружен и работает), а некоторые, ЗАВИСАЮТ СНОВА, что даже кнопку ОК в этом сообщении не нажать никак.. короче полная лажа... а платформа WINDOWS 2000.
Клиент - Fibplus 4.8
Реконнект реализован стандартными средствами ФИБа.
Вот выкладки из кода:
procedure TDM.IBDBConnect(Sender: TObject);
begin
.....
IBDB.WaitForRestoreConnect := 10000;
.....
end;
procedure TDM.IBDBLostConnect(Database: TFIBDatabase; E:FIBError;
var Actions: TOnLostConnectActions);
begin
....
IF IBDB.WaitForRestoreConnect > 0 then
begin
Form1.SetConnectStat("Соединение потеряно. Автовосстановление...", bctAllert);
form1.ShowStat("Восстановление", 0);
CloseAllDataSets;
CloseAllForms;
Actions := laWaitRestore;
end
....
end;
procedure TDM.IBDBErrorRestoreConnect(Database:TFIBDatabase; E:EFIBError;var Actions: TOnLostConnectActions);
begin
try Form1.SetConnectStat("Ошибка восстановления соединения. Автовосстановление...", bctAllert); except end;
end;
если клиент находится на машине сервера, то никаких проблем ведь не возникает... клиент просто тихо пытается постоянно реконнектится ,и когда сервер врубается - он просто подключается к нему.
Строка соединения с сервером выглядит таким образом:
SERV:D:\BASE\File.gdb (ещё раз напомню, что речь идёт о соединении с сервером через лок. сеть.)
так же пробовал у себя дома
VID:D:\BASE\File.gdb, т.е. по сути максимальная имитация сетевого соединения, и описанной проблемы не возникает.
При соединении через лок. сеть пробовал также и такой вариант строки соединения:
192.168.1.50:D:\BASE\File.gdb
192.168.1.50 - ip сервера,
но результат такой же...
Если Вы дошли до этого места :), то:
Вопрос 1:Что за фигня нафиг ?! :)
Вопрос 2:Как избежать длинного сообщения которое выкидывает клиента после потери связи с сервером (onLostConnect) ?
kaif (2003-10-19 14:48:00) [1]
2 VID © (17.10.03 00:56) [11]
С фибами не работал - не знаю. Знаю только, что как раз они много гордились своими умениями отрабатывать разрыв связи.
А вообще ставишь точку останова куда-нибудь внутрь IBDBLostConnect, запускаешь программу из под среды Delphi и дальше создаешь эту ситуацию (останавливаешь сервер). Если у тебя имеется исходный текст компонентов, то далее щелкаешь в IDE Delphi кнопку "Следующий шаг" и так далее (выполняешь программу пошагово), пока не поймешь, где висишь. Но насколько я понимаю, всякие wait используют WaitForSingleObject и тому подобные способы обработки событий, которые по идее как раз и должны впадать в ступор по природе своей.
я бы разбил задачу на несколько более мелких и разбирался бы с каждой проблемой в отдельности:
1. Зафиксировать обрыв связи и выдать/не выдать соотвт.сообщ.
2. Попытаться восстановить связь с небольшим timeout-ом порядка 2 сек. и выдать/не выдать сообщение
и так далее, а потом думал бы, как все это собрать в общую логику.
VID (2003-10-19 12:31:00) [2]
go up
VID (2003-10-17 12:50:00) [3]
go up
VID (2003-10-17 00:56:00) [4]
to kaif: Объясни пожалуйста свою мысль поподробней (кстати у меня фибы, не ibx)
kaif (2003-10-16 21:57:00) [5]
2 VID © (16.10.03 20:44) [9]
Мой тебе совет: посмотри пошагово, как IBX эту ситуацию отрабатывает. Тогда поймешь, в чем дело. А так - гадать придется.
VID (2003-10-16 20:44:00) [6]
хм... вообще то именно такой таймер у меня есть, он правда не реализует функцию восстановления соединения, его работа следущая: каждые 10 секунд он проверяет РЕАЛЬНОЕ наличие соединения с серваком с помощью функции TFIBDataBase.ExTestConnected():Boolean;
Так вот таймер, ПРОСТО ВЫЗЫВАЕТ эту функцию, даже не используется результат возвращаемый этой функцией.
А если уж функция ExTestConnected() обнаружит что связи с сервером уже нет, то она сама инициирует все необходимые для этого случая события TFIBDataBase, в данном случае это OnLostConnect (обработчик события приведён выше). А уже в свою очередь в OnLostConnect используется возможность фиба для реконнекта.
Так вот вся проблема в том что, когда сервер уже выключен, а клиент ещё думает что он приконнекчен, и делает очередную проверку ExTestConnected(), где-то:
а) в ходе выполнения функции ExTestConnected;
б) После выполнения функции ExTestConnected (перед вызовом обработчика onLostConnect);
в) или же в самом обработчике OnLostConnect (хотя там нет никаких предпосылок)
происходит нечто, что приводит к зависанию программы, и мне хотелось бы понять причину этого зависания
mOOx_ (2003-10-16 18:22:00) [7]
Ну ты тут всякое
IBDB.WaitForRestoreConnect := 10000;
используешь. А что если взять таймер, установить у него запуск через каждую сек, а на процедуру повесить проверку коннекта. Если он есть, то селяви, а если нет, то попытаться установить его.
VID (2003-10-16 14:12:00) [8]
to moox_: подробней, пожалуйста..
mOOx_ (2003-10-16 13:58:00) [9]
А почему бы не сделать проще и не повесить попытку соединения на таймер. Будет проще и без ошибок :)
VID (2003-10-16 13:46:00) [10]
флуд в этой ветке не поддерживается.
вся информация о проблеме приведена выше.
помощь "по-теме" от любого желающего принимается.
народ (2003-10-16 13:34:00) [11]
звали???
VID (2003-10-16 12:52:00) [12]
народ
VID (2003-10-16 04:12:00) [13]
to kaif: Ну во-первых, пути Господни неисповедимы... и оказывается иногда связь с сервером теряется. А во-вторых, что же получается: система реконнекта вроде есть, но работать она не будет что ли ? ;)
В-общем, надо это дело исправить, а не надеяться на чудо, не так ли ? ;)
kaif (2003-10-16 02:01:00) [14]
А почему вообще связь с сервером теряется?
У меня вот не теряется.
Или это на всякий пожарный?