Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB.NET: Windows Service kysymyksiä

Sivun loppuun

kari [11.06.2004 14:18:29]

#

Moi vaan kaikille.

ensimmäinen kysymys:
Oon tehnyt Windows Servicen, jossa ServiceProcessInstallerin ominaisuus Account = LocalSystem. Service pitäs saada etäkäynnistettyä. Onnistuuko ihan noin vain, vai vaikuttaako tuo Account siihen?

toinen:
Kun servicessä on timer, joka tekee jotain aina tietyn väliajoin, niin onko jotain helppoa tapaa lopettaa se tekeminen aina silloin, kun aika on kulunut. Siis kun välillä serviceni saattaa käyttää "yliaikaa" koodin suorittamiseen, niin haluaisin, että se lopettaa kaikki vanhat jutut, kun uusi Timer_Elapsed alkaa.

ja kolmas:
kun luon event login tällä tavalla:

' Create the source, if it does not already exist.
If Not EventLog.SourceExists("mySource") Then
  EventLog.CreateEventSource("mySource", "myService Log")
End If
' Create EventLog instance and assign its source.
Dim ev As New EventLog()
ev.Source = "mySource"

niin haluaisin, että se source ja mahdollinen uusi logi häviäisivät sieltä, kun service uninstalloidaan. Niin ei nimittäin käy ja kun yritin laittaa Uninstall-metodiin ev.DeleteEventSource ym. niin koko service jumitti ja antoi virheilmoituksia, että ei sitä voi poistaa.

onko tietoa?

toivottavasti ymmärsitte kysymykset.

JoreSoft [11.06.2004 15:31:26]

#

Oletko muistanut sulkea, kaikki avoinna olevat systeemit ennen sulkemista? (Poistamista)

Antti [12.06.2004 00:28:53]

#

1: Mitä kautta aioit palvelun etäkäynnistää? Yleensä prosessille määritelty käyttäjätunnus koskee vain käynnistyksen yhteydessä tapahtuvaa käynnistystä.

2:Riippuu vähän siitä ,oitä serveri tekee ennen seuraavaa eventtiä.

Kolmanteen kysymykseem täytyy nyt kertoa, että niin kauan kuin tiedosto on käytössä (siihen kirjoitetaan tai se on avoinna) sitä ei voi poistaa...

kari [14.06.2004 08:28:06]

#

1:se etääynnistys tapahtuisi siten, että ensin tietenkin asentaisin sen servicen sille koneelle ja sitten lähiverkon kautta jostain toiselta koneelta start. Käyttis on XP, eli silloin ei kai voi käyttää ainakaan sitä "NetworkService" accounttia..

2: Siellä Timer_Elapsed metodissa on vain yksi metodikutsu. Se metodi puolestaam ohjaa taas kaikkea muuta toimintaa. Siellä otetaan yhteyksiä lähiverkon kautta muihin koneisiin ja tietokantapäivityksiä on kanssa. Eikö muka ole olemassa mitään "unohda kaikki mitä olit tekemässä" komentoa?

3: joo se EventLog asia saa jäädä niin kuin on

Yksi asia vielä: Huomasin, että servicessä kello jätättää noin 40 millisekunttia joka kerta. Onko kukaan huomannut samaa? Eli siis Timer_Elapsed metodia kutsutaan aina 40 millisekuntia pidemmän ajan kuluttua, eli intervalliin ikäänkuin lisätään se 40.

Koodissani alussa interval on 100 millisekunttia ja timer.enabled = false. sitten asetan intervalin 30 sekunniksi ja enabloin timerin. olen testannut asiaa paljon ja kyllä se koko ajan jätättää, joskus enemmän ja joskus vähemmän.

Antti [14.06.2004 12:09:32]

#

1. Joudut luultavasti rakentamaan jonkinlaisen Client-Server mallin tuota käynnistystä varten. Tutkippa MSDN:stä WinSock kontrollia.

2. Ainoa tapa lopettaa muissä hallitsemattomissa säikeissä tapahtuva suoritus taitaa olla VB:n puolella koneen boottaaminen ;) - varsinkin kun kyseessä on verkkoliikenne.

VB.NET:issä on sen sijaan process-olio, jonka avulla voit vaikuttaa säikeistettyyn sovellukseen.

3. Tuosta eventlog hommasta - Sulje ensiksi tiedosto ja poista sitten vasta.

kari [14.06.2004 13:32:41]

#

Voisitko Antti mitenkään valaista sitä VB.NETin process oliota? yritin etsiä tietoa, mutta se ei oikein aukene..

Antti [14.06.2004 15:25:15]

#

Jos sinulta löytyy tuore MSDN, sieltä löytyy aiheesta.

Kaikessa yksinkertaisuudessaan:

Dim MyProcess As System.Diagnostics.Process
MyProcess = Process.Start("C:\MyProgram.exe", "Arguments")
MyProcess.Kill()

kari [15.06.2004 09:02:46]

#

aivan joo, mutta sehän tappaa koko sovelluksen. kun pitäs vaan se yksi säie tuhota..

sain muuten jotenkuten korjattua asian siten, että siellä timer_elapsed:ssa luon ensin säikeen ja sitten ku sinne tullaan uudestaan, niin katotaan onko säie elossa
myThread.IsAlive ja jos on niin myThread.Abort.
se ei toimi kuitenkaan kovin hyvin, koska se säie ei lopeta heti. mutta kun laitoin lisäksi synclockin, niin eipähän ainakaan tule päällekkäisyyksiä.

kun ei oikeen oo kokemusta tosta vb:stä, niin pakko yrittää soveltaa jotain omaa.

Antti [15.06.2004 15:57:50]

#

Tee se säie omaksi erilliseksi sovelluksekseen, joka suorittaa näitä omia toimintojaan.

Siis process oliolla saat ulkoisen sovelluksen käyntiin omassa säikeessään käynnistävän ohjelman alaisuudessa ja hallittua sitä prosessia.

Tuosta timerista - kokeilin omalla koneella niin ei se jätätä yhtään (joka päivä ehdin mainiosti junalle töitten jälkeen ;D)... olisiko koneessasi mätää tai ennenkuin poimit testiarvon tekeekö ohjelma jotain muuta?

kari [18.06.2004 09:46:11]

#

se timer on kyllä outo. huomasin sen jätätyksen siinä, kun otin aikaleiman aina heti kun timer_elapsed metodi käynnistyi. eli sitä ennen ei tehty mitään. mun kannettavalla se tosiaan jätättää sen 40 ms mutta muilla koneilla ilmeisesti ei. ainakin yhellä koneella se toimi ihan ok. ehkä se on joku henkimaailman juttu.

Antti [18.06.2004 13:12:04]

#

Tsekkaappa taskmanagerista prosessorin käyttö ajaessasi sitä softaa - jos prosessoriaika on priorisoitu jollekkin toiselle säikeelle korkeammalla prioriteetillä saattaa olla että timeri ei pääse suorittamaan eventtiä ennenkuin toinen prosessi vapauttaa sille prosessoriaikaa...

Yksi tälläinen sovellus on Nortonin nerokas NAV...


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta