[Delphi] Service Application geschreven, nu rebootprobleem

Pagina: 1
Acties:

  • crazyx
  • Registratie: Juli 2001
  • Laatst online: 06-05 23:10
Ik heb net een Service Application in Delphi 5 geschreven, op zich werkt alles goed; en doet die alles wat ik maar wil, en daar krijg ik geen foutmeldingen of zo. Dus ik was heel tevreden tot ik mijn pc wou afsluiten. En dat werkte blijkbaar niet meer. Ook rebooten gaat niet meer of uitloggen uit mijn userprofiel. Het werkt wel allemaal terug als ik mijn Service stop. (en dat werkt gewoon, ik krijg hier ook geen foutmeldingen).

Ik maak gebruik van een timer die elke 60 seconden iets nakijkt, (en dan evt een bewerking doet die max 2 seconden duurt)

Achteraf heb ik dit er ook bijgezet, ik hoopte dat dit het probleem op zou kunnen lossen, maar helaas

code:
1
2
3
4
5
6
7
procedure TServiceBackup.ServiceExecute(Sender: TService);
begin
  timer.enabled := true;
  while not terminated do
    servicethread.processrequests(true);
  timer.enabled := false;
end;


Wat zou hier het probleem kunnen zijn?

Verwijderd

Als 't de enige service thread in deze service is, probeer 't dan 's zonder TTimer:
code:
1
2
3
4
5
6
7
procedure TServiceBackup.ServiceExecute(Sender: TService);
begin
  while not Terminated do begin
    Sleep(60000);
    ServiceThread.ProcessRequests(False);
  end;
end;

Ik heb al meer van dit soort problemen met timers in een service thread gezien in Delphi 5 en ouder. Misschien is 'ie vanaf D6 pas echt threadsafe?

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Timers moet je niet in threads gebruiken en zijn bovendien onnodig. Zie de oplossing van Afterlife.

We adore chaos because we like to restore order - M.C. Escher


  • crazyx
  • Registratie: Juli 2001
  • Laatst online: 06-05 23:10
Dat was het probleem dus niet. (Maar ik heb het wel aangepast, is toch netter op die manier).

Het lag aan het nmsmtp en nmftp component dat ik gebruik. Als ik ze in runtime aanmaak en verwijder, dan werkt alles wel perfect.

Een heel vervelende bug... maar waarschijnlijk heb je er in de recentere delphi versies geen last meer van.

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 13-05 20:49

Tomatoman

Fulltime prutser

Heb je wat meer info over die bug? Jaren geleden heb ik rebootproblemen gehad met NMUDP in combinatie met Delphi 5 en ik ben er nooit achtergekomen wat het probleem was.

Een goede grap mag vrienden kosten.


Verwijderd

Ik ben nooit kapot geweest van die NetManage componenten.
Indy bevalt me een stuk beter, en is ook een stuk stabieler in multithreaded omgevingen.

Verwijderd

moet je niet de (heb ff geen delphi bij de hand, kan ';m niet precies noemen), event afhandelen die aan jouw service vraagt (wm_queryend ofzoiets) of windows mag stoppen ?

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 13-05 20:49

Tomatoman

Fulltime prutser

WM_QUERYENDSESSION en WM_ENDSSESSION handelde ik netjes af, daaraan kan het niet gelegen hebben. Het programma is inmiddels niet meer in gebruik, zodat de oplossing van het probeem ook niet meer belangrijk is, maar ik ben toch benieuwd of het inderdaad een bug in de NetManage componenten was.

Een goede grap mag vrienden kosten.


Verwijderd

Eigenlijk zou je die Windows messages niet eens hoeven af te vangen, TService en TServiceThread kunnen dat prima zelf afhandelen.
Maar... TService is een afgeleide van TDataModule, en zoals 't een datamodule betaamt probeert 'ie eerst alle objecten waar 'ie owner van is op te ruimen. Als dat niet lukt wordt een exception gegenereerd, maar blijft die TService nog steeds bestaan (hij komt niet toe aan z'n eigen destructor).

Dat is denk ik ook de reden waarom 't bij crazyx eerst niet werkte, en bij dynamisch aangemaakte NM componenten wel. In de 1e situatie laat je 't opruimen aan de TService over, en in het 2e geval doe je dat zelf (hoop ik tenminste :)).
Pagina: 1