Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2004.01.16;
Скачать: [xml.tar.bz2];

Вниз

---|Ветка была без названия|---   Найти похожие ветки 

 
Digitman   (2003-10-31 14:58) [80]

кто-то из вас точно лапшу вешает)

>Жирная строчка выполняется

не мое утверждение - автора !

а выполняется она, будучи вызванная из обработчика OnExecute()

а обработчик OnExecute(), согласно последним "веяниям", не вызывается)))))

лыко-мочало, поехали сначала)

клоунада))


 
Reindeer Moss Eater   (2003-10-31 14:59) [81]

Я же про обработчик OnExecute, а не про метод Execute треда


 
h0use   (2003-10-31 15:04) [82]


> а обработчик OnExecute(), согласно последним "веяниям",
> не вызывается)))))

Последние "веяниия" реальны...выполнялась она только когда я в аплекухе отлаживал, сейча до нее даже не доходит. OnExecute не выполняется вообще!


 
Digitman   (2003-10-31 15:07) [83]


> Reindeer Moss Eater


и я - про него !
про обработчик TidTCPServer.OnExecute !

при чем здесь TService.OnExecute и CommandHandlers ?

это уже давно проехали - событие TService.OnExecute он якобы, по моему настоянию, не назначает и не обрабатывает никак, TCPServer он стартует в TService.OnStart, останавливает в TService.OnStop

все просто д.б. как божий день - никакие TService.OnExecute нас не волнуют вообще


 
Digitman   (2003-10-31 15:09) [84]


> h0use


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

> Жирная строчка выполняется

??


 
h0use   (2003-10-31 15:14) [85]

Дая просто вчера не ту апликацию запускал, я тут урывками софт пишу от основной работы, вот и путаю иногда, а сегодня вот посвободней и я точные данные выдаю. А они описаны в [82]


 
Digitman   (2003-10-31 15:25) [86]

так...

TBAService.TCPServerConnect у тебя вызывается ?

если - да, ищи там исключение.

если оно там происходит, то до OnExecute, разумеется, дело не дойдет !

вот и весь фокус


 
Reindeer Moss Eater   (2003-10-31 15:27) [87]

и я - про него !
про обработчик TidTCPServer.OnExecute !


Все, что я говорил, было:

Когда завершается TidTCPServer.OnExecute (когда завершается обработчик) TCP сервер не рвет коннект.


 
h0use   (2003-10-31 15:29) [88]

TBAService.TCPServerConnect , аналогично даже не входит в процедуру! Я уж не говорю об отсутствии ексепшинов и сакцессов.


 
Digitman   (2003-10-31 15:35) [89]


> Reindeer Moss Eater


ладно, дальше все ясно


> h0use ©


последние штрихи к "портрету твоего кода" :

после коннекта транспортный тред не будет задействован (и, соответственно, ты не получишь ни одно из событий OnConnect/OnExecute/OnDisconnect), если ты напортачил со св-вом Intercept. При возникновении там исключения никакого трансп.потока и никаких событий ты не получишь, и коннект будет тут же автоматом разорван сервером, что и наблюдается.

Вот тебе и вся сказка твоя.

А ты - "сервис, сервис" !!


 
h0use   (2003-10-31 15:46) [90]

Я Intercept не трогал, я пытался, но не копилится, поэтому у меня этот код убран вообще!


 
Digitman   (2003-10-31 16:00) [91]

не знаю уж, что ты там "трогал" или не "трогал", но - вот ориг.код :


procedure TIdListenerThread.Run;
var
Peer: TIdTCPServerConnection;
Thread: TIdPeerThread;
i : Integer;
begin
FBindingList.Clear;
for i:= 0 to Server.Bindings.Count - 1 do begin
FBindingList.Add(TObject(Server.Bindings[i].Handle));
end;
if GStack.WSSelect(FBindingList, nil, nil, AcceptWait) > 0 then begin
if not Terminated then begin
for i := 0 to FBindingList.Count - 1 do begin
Peer := TIdTCPServerConnection.Create(Server);
with Peer do begin
Binding.Accept(TIdStackSocketHandle(FBindingList[i])); // в этот момент твой клиент получает OnConnect-событие
// LastRcvTimeStamp := Now; // Added for session timeout support
// ProcessingTimeout := False;
if Assigned(Server.Intercept) then begin
try
Peer.Intercept := Server.Intercept.Accept(Binding);
Peer.InterceptEnabled := True;
except
FreeAndNil(Peer); // а в этот твой клиент вываливается, ибо здесь закрывается соединение с ним
end;
end;
end;
if Peer <> nil then begin //после чего эта строчка не выполняется, поток не стартует, и , соотв-но, никаких событий ты не видишь на сервере
// Create Thread
Thread := TIdPeerThread(Server.ThreadMgr.GetThread);
Thread.FConnection := Peer;
Server.Threads.Add(Thread);
Thread.Start;
end;
end;
end;
end;
end;


ты скажи лучше, почему ты OnException не обрабатываешь на сервере ?

для Пушкина что ль событие это ? для тебя !!! что бы ты в сомнительных ситуациях видел, что в ходе работы сервера привело к исключительной ситтуации !!


 
Digitman   (2003-10-31 16:02) [92]


> Я Intercept не трогал, я пытался, но не копилится, поэтому
> у меня этот код убран вообще


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


 
h0use   (2003-10-31 16:07) [93]

Вот как у меня сейчас:

procedure TBAService.TCPServerExecute(AThread: TIdPeerThread);
var
Client : TSimpleClient;
Msg : String;
St : String[15];
begin
MessageBox(0, "", "TCPServerExecute", MB_OK or MB_SETFOREGROUND or MB_TOPMOST);
If AThread.Data=nil then Exit;
Msg:= AThread.Connection.ReadLn;
MessageBox(0, "",PChar( "New text "+Msg), MB_OK or MB_SETFOREGROUND or MB_TOPMOST);
If Msg="" then
begin
AThread.Connection.WriteLn("@Error:Empty String");
exit;
end;
{ Get the clients package info }
Client := Pointer(AThread.Data);
{ Check to see if the clients name has been assigned yet }
if Client.Name = "Logging In" then
begin
{ if not, assign the name and announce the client }
MessageBox(0, "", "New Client", MB_OK or MB_SETFOREGROUND or MB_TOPMOST);
Client.Name := Msg;
if flBaseStat then Client.Permission:=1;
If Client.Permission<>1 then
begin
MessageBox(0, "", "Disconnect", MB_OK or MB_SETFOREGROUND or MB_TOPMOST);
TCPServerDisconnect(AThread);
Exit;
end;
Athread.Connection.WriteLn("HELLO");
Case Client.Permission of
4: St:="Administrator";
3: St:="Developer";
2: St:="Saler"
end;
SaveLog(2,"+ User "+Client.Name+" from "+Client.DNS + " was logging in as "+St+".");
end;
end;
//------------------------------------------------------------------------------
procedure TBAService.TCPServerDisconnect(AThread: TIdPeerThread);
var
Client : TSimpleClient;
begin
try
Client := Pointer(AThread.Data);
If Client=nil then Exit;
Clients.Delete(Client.ListLink);
If Client.Permission<>1 then
begin
SaveLog(2,"+ User "+Client.Name+" from "+Client.DNS + " was logging out by server.");
Athread.Connection.WriteLn("@LOGOUT:Server stopped");
end
else
begin
SaveLog(2,"- User "+Client.Name+" from "+Client.DNS + " was kicked out by server.");
SaveLog(2,"! Error: User "+Client.Name+" has no access rights.");
Athread.Connection.WriteLn("@DENY:Database not started");
end;
Client.Free;
AThread.Data := nil;
UpdateClientList;
MessageBox(0, "", "Success", MB_OK or MB_SETFOREGROUND or MB_TOPMOST);
If Clients.Count<1 then flUserConnected:=False;
except
on E: Exception do
begin
SaveLog(2,"! Error: "+e.Classname + " " + e.Message);
MessageBox(0, "


 
Digitman   (2003-10-31 16:12) [94]

я ему про фому, он мне все про ерему таддычит)))

что ты снова тычешь свой код ?
не выполняется же он ! ни одно событие ! выяснили же ...
или уже с какого-то перепугу события начали возбуждаться ?

тебе последний раз говорю - ГДЕ У ТЕБЯ ОБРАБОТКА OnException() ?

все, больше тянуть из тебя не намерен, у меня своей работы полно, еще няньчиться с тобой


 
h0use   (2003-10-31 16:16) [95]


> ты скажи лучше, почему ты OnException не обрабатываешь на
> сервере ?

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


 
Reindeer Moss Eater   (2003-10-31 16:24) [96]

Через пару дней выяснится, что вообще
TCPServer.Active = False


 
Digitman   (2003-10-31 16:27) [97]

чему равно и как явно используется св-во ThreadMgr ?


 
h0use   (2003-10-31 16:31) [98]


ThreadMgr: TIdThreadMgrDefault;

TCPServer.ThreadMgr:=ThreadMgr;


 
Digitman   (2003-10-31 16:33) [99]


> Reindeer Moss Eater


все может быть)
хотя автор упорно продолжает утверждать , что событие Клиент.OnConnect возбуждается)

еще двух таких дней я не вынесу) ... прямая дорога на погост)

ну не хочет думать человек !

давно бы уж, б.., исходники нашел и оттрассировал бы логику потрохов Инди ! вкупе со своей приклеенной)

я ж вот не поленился кучу времени потратить на него и даже исх-ки скачать(


 
Digitman   (2003-10-31 16:38) [100]


> h0use © (31.10.03 16:31) [98]
>
> ThreadMgr: TIdThreadMgrDefault;
>
> TCPServer.ThreadMgr:=ThreadMgr;


эт чего ? это где ?


 
Digitman   (2003-10-31 16:43) [101]

давай сюда тела обработчиков TService

OnStart
OnExecute
OnStop


 
h0use   (2003-10-31 16:58) [102]


procedure TBAService.ServiceStart(Sender: TService; var Started: Boolean);
begin
flServerStat := False;
flBaseStat := False;
flViewLaunch := False;
flHasChanges := False;
flUserConnected := False;
flByName := True;
flAutostart := False;
flAutoSelectLast:= True;
flLogNet := True;
flShowIcon := True;
flAllreadyShow := False;
// if not assigned (CS) then CS := TCriticalSection.Create;
StartLogging;
If not LoadFromReg then LoadDefaults;
if flAutoStart then
if ServerStart and BaseStart then SaveLog(1, "+ Successefully started.")
else SaveLog(1, "- Started with any errors.");

Started := True;
MessageBox(0, "", PChar("Service started "+BoolToStr(Started)), MB_OK or MB_SETFOREGROUND or MB_TOPMOST);
end;
//------------------------------------------------------------------------------
procedure TBAService.ServiceStop(Sender: TService; var Stopped: Boolean);
var
f1,f2:Boolean;
begin
f1:=True;f2:=True;
if flBaseStat then f2:=BaseStop;
if flServerStat then f1:=ServerStop;
If f1 and f2 then SaveLog(1, "+ Successefully stopped.")
else SaveLog(1, "- Stopped with any errors.");
StopLogging;
// if assigned(CS) then FreeAndNil(CS);
// ServiceThread.Terminate;
Stopped := True;
end;
//------------------------------------------------------------------------------
procedure TBAService.ServiceContinue(Sender: TService;
var Continued: Boolean);
var
f1,f2:Boolean;
begin
f1:=True;f2:=True;
if not flServerStat then f1:=ServerStart;
if not flBaseStat then f2:=BaseStart;
If f1 and f2 then SaveLog(1, "+ Successefully restarted.")
else SaveLog(1, "- Restarted with any errors.")
end;
//------------------------------------------------------------------------------
procedure TBAService.ServicePause(Sender: TService; var Paused: Boolean);
var
f1:Boolean;
begin
try
f1:=True;
if flServerStat then f1:=ServerStop;
If f1 then SaveLog(1, "+ Successefully paused.")
else SaveLog(1, "- Paused with any errors.");
Paused:=True;
except
end;
end;
//------------------------------------------------------------------------------
procedure TBAService.ServiceShutdown(Sender: TService);
begin
// ServiceStop(Sender,True);

end;

procedure TBAService.ServiceExecute(Sender: TService);
begin
Stream := TMemoryStream.Create;
try

while not Terminated do
begin
ServiceThread.ProcessRequests(True);
Sleep(10);
end;
finally
Stream.Free;
end;
end;


 
h0use   (2003-10-31 17:00) [103]


> Digitman © (31.10.03 16:38) [100]
>
> > h0use © (31.10.03 16:31) [98]
> >
> > ThreadMgr: TIdThreadMgrDefault;
> >
> > TCPServer.ThreadMgr:=ThreadMgr;
>
>
> эт чего ? это где ?


Это ответ на вопрос [97]


 
Digitman   (2003-10-31 17:10) [104]

тела ф-ций, упомянутых в

if ServerStart and BaseStart then ...

на хирург.стол !!


 
h0use   (2003-10-31 17:12) [105]


function TBAService.ServerStart:Boolean;
var
Binding : TIdSocketHandle;
begin
TCPServer:=TIdTCPServer.Create(Self);
AntiFreeze:=TIdAntiFreeze.Create(Self);
MessageBox(0, "", "Server create", MB_OK or MB_SETFOREGROUND or MB_TOPMOST);
AntiFreeze.Active:=True;
TCPServer.Bindings.Clear;
try
TCPServer.DefaultPort:=StrToInt(ServerPort);
If flByName then
begin
Binding:=TCPServer.Bindings.Add;
Binding.Port:=StrToInt(ServerPort);
end
else
begin
Binding:=TCPServer.Bindings.Add;
Binding.IP:=ServerIP;
Binding.Port:=StrToInt(ServerPort);
end;
TCPServer.Active:=True;
SaveLog(2,"+ Server is started.");
MessageBox(0, "", "Server is started.", MB_OK or MB_SETFOREGROUND or MB_TOPMOST);
flServerStat:=True;
If flLogNet then
begin
// TCPServer.Intercept.Init:= NetLogEvent;
NetLogEvent.Active:=True;
end
else
begin
NetLogEvent.Active:=False;
// TCPServer.Intercept:=nil;
end;
Clients:=TList.Create;
Result:=True;
except
on E : Exception do
begin
SaveLog(2,"- Server isn""t started.");
MessageBox(0, "Исключение !", PChar("Server isn""t started."), MB_OK or MB_SETFOREGROUND or MB_TOPMOST);
SaveLog(2,"! Error: "+E.Message);
Result:=False;
end;
end;
end;
//------------------------------------------------------------------------------
function TBAService.BaseStart:Boolean;
begin
try
BADBCon:=TADOConnection.Create(Self);
BADBCon.Connected:=True;
SaveLog(4,"+ Database is started.");
Result:=True;
except
on E : Exception do
begin
SaveLog(4,"- Database is""nt started.");
SaveLog(4,"! Error: "+E.Message);
Result:=False;
end;
end;
end;
//------------------------------------------------------------------------------
function TBAService.ServerStop:Boolean;
begin
Result:=True;
try
FreeAndNil(AntiFreeze);
FreeAndNil(NetLogEvent);
FreeAndNil(TCPServer);
FreeAndNil(Clients);
flServerStat:=False;
SaveLog(2, "+ Server is stopped.");
except
on E : Exception do
begin
SaveLog(2,"- Server isn""t stopped.");
SaveLog(2,"! Error: "+E.Message);
Result:=False;
end;
end;
end;
//------------------------------------------------------------------------------
function TBAService.BaseStop:Boolean;
begin
try
BADBCon.Connected:=False;
FreeAndNil(BADBCon);
SaveLog(4,"+ Database is stopped.");
Result:=True;
except
on E : Exception do
begin
SaveLog(4,"- Database is""nt stopped.");
SaveLog(4,"! Error: "+E.Message);
Result:=False;
end;
end;
end;


 
Digitman   (2003-10-31 17:14) [106]

и с какого хрена

Started := True;

???

а если все предыдущие операторы в теле OnStart() выполнились без исключений, НО не выполнили успешно ожидаемую от них логику ?


 
h0use   (2003-10-31 17:20) [107]


> выполнились без исключений, НО не выполнили успешно ожидаемую
> от них логику

Это собственно как? Если выполнились успешно, то они будут True, если не успешно, то они False. Сервер отдает True, я уже проверял, не работает только БД, которая пока итак не задействована, поэтому я в пилотном варианте и поставил True на Started.


 
Digitman   (2003-10-31 17:20) [108]

о божен !!! о боже !!! какой кошмар !!!


> AntiFreeze:=TIdAntiFreeze.Create(Self);


это что ? это зачем ?


> TCPServer.Active:=True; // first step
......
> Clients:=TList.Create; // next step


что за несуразица ? почему не наоборот ? почему список, используемый в транспортных потоках, создается ПОЗЖЕ активизации сервера ? ведь тр.потоки к нему обращаются !!

безобразный код !!!


 
h0use   (2003-10-31 17:28) [109]


> > AntiFreeze:=TIdAntiFreeze.Create(Self);

Это чтоб не засыпал сокет

>
> > TCPServer.Active:=True; // first step
> ......
> > Clients:=TList.Create; // next step

Это после того как мне посоветовали создавать объект в ручную при старте сервиса, раньше было просто TCPServer.Active:=True?
Ну у код воткнул не сомтря...спасибо за наводку...FIXED


 
Digitman   (2003-10-31 17:32) [110]

function TBAService.ServerStop:Boolean;
begin
Result:=True;
// какого ... сначала безусловный True, а потом уже вся логика обработчика ? успешное выполнение которой собственно и должно давать повод для True ?
end;


 
Digitman   (2003-10-31 17:34) [111]


> Это чтоб не засыпал сокет


С какого ... он должен "заснуть" ? И что значит "заснуть" ? Где ты этих дурацких терминов, смысла которых не понимаешь, нахватался ?


 
h0use   (2003-10-31 17:35) [112]

А его раньше не было, я добавил чтоб Delphi warnings не писала, что у меня параметр не проинициализирован, в принципе кроме как на разбухание программы эта строчка ни на что не влияет. Потом в многих примерах гуру в инете я видил аналогичную начальную инициализацию Result в функциях


 
h0use   (2003-10-31 17:37) [113]


> Digitman © (31.10.03 17:34) [111]
>
> > Это чтоб не засыпал сокет
>
>
> С какого ... он должен "заснуть" ? И что значит "заснуть"
> ? Где ты этих дурацких терминов, смысла которых не понимаешь,
> нахватался ?

Prevents an application UI from freezing.

TIdAntiFreeze = class(TIdAntiFreezeBase)

Unit

IdAntiFreeze

Description

Indy works on the blocking model. That is when calls are made to Indy the do not return until they are complete. If calls are made in the main thread this will cause the Application User Interface to "freeze" during Indy calls. TIdAntiFreeze counter acts this effect. TIdAntiFreeze allows Indy subsystem to make process Application message calls so that Windows messages continue to be executed while Indy blocking socket calls are in effect.

Only one TIdAntiFreeze can be active in an application. If another instance already exists, an exception is raised. TIdAntiFreezeBase uses the global variable GAntiFreeze, declared in the TIdAntiFreezeBase unit, to determine if another instance has already been created.

Note: GAntiFreeze is not assigned if an instance is added in the form designer (during design time).

Note: The TIdAntiFreeze.pas unit must NOT appear in the uses clause of any Indy or descendant unit. This unit is linked in an application when the component is placed on a Form. This is done to preserve isolation from the Forms.pas and QForms.pas units.


 
Digitman   (2003-10-31 17:41) [114]


> If calls are made in the main thread


угу ...
молодца ! сам-то читал-вникал в цитату ??

ты из в main thread в дан.случае делаешь, эти самые calls ???????
ну ни фига головой думать не хочешь !!

содрал код один в один, совершенно бездумно, и думаешь после этого, что все должно само собой работать !!


 
Reindeer Moss Eater   (2003-10-31 17:52) [115]

TIdAntiFreeze нужен исключительно в GUI приложениях.


 
Reindeer Moss Eater   (2003-10-31 17:52) [116]

Да и там он опционален.


 
h0use   (2003-10-31 17:59) [117]

Убрал его. В принципе он и не мешал.


 
Digitman   (2003-11-01 11:56) [118]

значит, так : выкидывай все что ты там понаворочал, кроме обработчиков событий TCPServer, и реализуй простейшие обработчики событий сервиса - только OnStart и OnStop

procedure TBAService.ServiceCreate(...);
begin
TCPServer:=TIdTCPServer.Create(Self);
end;

procedure TBAService.ServiceStart(Sender: TService; var Started: Boolean);
begin
try
... инициализация параметров объекта TCPServer ...
TCPServer.Active := True;
Started := TCPServer.Active
except
on e: exception do
LogMessage("Exception raised in OnStart : " + e.ClassName + " " + e.Message);
end;
end;

procedure TBAService.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
try
TCPServer.Active := False;
Stopped := not TCPServer.Active;
except
on e: exception do
LogMessage("Exception raised in OnStop : " + e.ClassName + " " + e.Message);
end;
end;


 
h0use   (2003-11-04 10:29) [119]

Спасибо за оптимизацию моего бреда, тперь програма перешла в новый статус - клиент при попытке законнектится пишет "#100061 Connection refused" Сервер стартует, но в логах пишется какая-то лабуда, не могу разобрать что бы это значило:
"The description for Event ID ( 0 ) in Source ( BAServer.exe ) cannot be found. The local computer may not have the necessary registry information or message DLL files to display messages from a remote computer. You may be able to use the /AUXSOURCE= flag to retrieve this description; see Help and Support for details. The following information is part of the event: The service process could not connect to the service controller."


 
Reindeer Moss Eater   (2003-11-04 10:37) [120]

Если [118], то
TIdTCPServer не имеет обработчика OnExecute.



Страницы: 1 2 3 4 вся ветка

Форум: "Система";
Текущий архив: 2004.01.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.7 MB
Время: 0.02 c
1-49482
anti256
2003-12-23 18:21
2004.01.16
PChar


3-49406
Rem
2003-12-18 17:11
2004.01.16
Снятие аттрибута ReadOnly с полей в TClientDataSet


11-49472
=Sniper=
2003-05-03 21:13
2004.01.16
Label и вообще компоненты!


3-49440
S.A.S.
2003-12-17 14:21
2004.01.16
Разрешение на открыти базы в Win2000


3-49401
new
2003-12-19 15:54
2004.01.16
dbgrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский