Avatar billede the_fox Nybegynder
12. januar 2007 - 22:09 Der er 12 kommentarer og
1 løsning

Windows service og Timer

Hej Experter,

Jeg er ved at lave en windows service som hvert 10'ende sekund skal tjekke om der sidder noget i drev G. Men jeg har lidt problemer med at se hvor jeg skal placere timeren for at den bliver kørt?

Her er min kode:

public Service1()
        {
            // This call is required by the Windows.Forms Component Designer.
            InitializeComponent();

            // TODO: Add any initialization after the InitComponent call
            if(!System.Diagnostics.EventLog.SourceExists("DoDyLogSourse"))
            {   
                System.Diagnostics.EventLog.CreateEventSource("DoDyLogSourse","DoDyLog");
            }

                eventLog1.Source = "DoDyLogSourse";
                eventLog1.Log ="DoDyLog";
           
        }

        // The main entry point for the process
        private static Random rng = new Random();
        static void Main()
        {
            System.ServiceProcess.ServiceBase[] ServicesToRun;
           
            // More than one user Service may run within the same process. To add
            // another service to this process, change the following line to
            // create a second service object. For example,
            //
            //  ServicesToRun = New System.ServiceProcess.ServiceBase[] {new Service1(), new MySecondUserService()};
            //
            ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MyNewService.Service1()};
            System.ServiceProcess.ServiceBase.Run(ServicesToRun);
           
            Timer t = new Timer(new TimerCallback(Test), null, 0, 10000);
            while(true) Thread.Sleep(10);           

        }
        static void Test(Object o)
        {
        Thread.Sleep(rng.Next(10) * 1000);

            FileStream fs = new FileStream(@"c:\skriv.txt" , FileMode.OpenOrCreate,    FileAccess.Write);
            StreamWriter m_streamWriter = new StreamWriter(fs);
            m_streamWriter.BaseStream.Seek(0, SeekOrigin.End);            

            if (Directory.Exists("G:\\"))
            {
                m_streamWriter.WriteLine("G mounted "+ DateTime.Now + "\n");
            }
            else
            {
                m_streamWriter.WriteLine("G unmounted "+ DateTime.Now+ "\n");
            }
            m_streamWriter.Flush();
            m_streamWriter.Close();
            fs.Close();

            /*Process myProcess = new Process();
            myProcess.StartInfo.FileName = "notepad.exe";
            myProcess.Start();*/
        }
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.eventLog1 = new System.Diagnostics.EventLog();
            ((System.ComponentModel.ISupportInitialize)(this.eventLog1)).BeginInit();
            //
            // eventLog1
            //
            this.eventLog1.Log = "DoDyLog";
            this.eventLog1.Source = "DoDyLogSource";
            //
            // Service1
            //
            this.ServiceName = "USB Viruskontrol";
            ((System.ComponentModel.ISupportInitialize)(this.eventLog1)).EndInit();

        }
Avatar billede coderdk Praktikant
12. januar 2007 - 22:18 #1
Hvorfor checke det med en timer? Hvorfor ikke abonnere på WM_DEVICECHANGE?
C Sharp Ripper har vist insertion notification: http://www.codeproject.com/csharp/CSharpRipper.asp
Ellers er der noget her på Expert Sex Change (:D):
http://www.experts-exchange.com/Programming/Programming_Languages/C_Sharp/Q_20513152.html
Avatar billede coderdk Praktikant
12. januar 2007 - 22:20 #2
Avatar billede the_fox Nybegynder
12. januar 2007 - 22:39 #3
Problemet er at drev G er til USB-drev og det reagerer den ikke på. Derfor vil jeg gerne have timeren til at virke...
Avatar billede coderdk Praktikant
12. januar 2007 - 22:49 #4
Virker WM_DEVICECHANGE ikke med USB-drev? Det er jeg da næsten sikker på at det gør...?!
Avatar billede the_fox Nybegynder
12. januar 2007 - 22:51 #5
Der står: Now, to clarify the concepts lets use something useful. Maybe some of the readers have the need to detect if a CD, or for what matters any removable volume mounted on a device which supports a software ejection method (DVD, Zip, etc…), has been inserted or removed from a device.
Jeg har også lige prøvet at indsætte og fjerne USB-sticken uden resultat. CD-drev virker fint.
Avatar billede coderdk Praktikant
12. januar 2007 - 23:03 #7
Den fra codeproject kan så godt tweakes. Kig i kommentarerne:

http://www.codeproject.com/dotnet/devicevolumemonitor.asp?df=100&forumid=15152&select=854289#xx854289xx

Det er stadig WM_DEVICECHANGE du skal bruge ;)
Avatar billede the_fox Nybegynder
14. januar 2007 - 11:46 #8
Ahaaa! Ja, det kan jeg se og det virker fint med USB! :)

Men jeg sidder stadig fast i mit oprindelige spørgsmål, nemlig hvor i min service jeg skal placere "min" kode for at den bliver kørt?

Som du kan se i koden ovenfor har jeg placeret
  Timer t = new Timer(new TimerCallback(Test), null, 0, 10000);
  while(true) Thread.Sleep(10);

i Main() men den bliver ikke kørt?
Avatar billede the_fox Nybegynder
14. januar 2007 - 15:03 #9
Det ser godt nok noget avanceret ud, det fra codeproject. Også her støder jeg lidt panden mod en mur. Den melder fejl i denne linie når jeg kompilerer:

internal class _DeviceVolumeMonitor: NativeWindow

og det skyldes jo nok at der ikke er noget vindue, når det er en service jeg leger med. Har du et godt forslag til hvordan jeg kommer videre? Jeg vil gerne sætte lidt flere points på højkant.
Avatar billede coderdk Praktikant
14. januar 2007 - 17:48 #10
Jah, det kan jeg godt se - Du er faktisk nødt til at installere en global system hook, a la http://www.codeproject.com/csharp/globalsystemhook.asp?df=100&forumid=35025&exp=0&select=1526743
Avatar billede the_fox Nybegynder
14. januar 2007 - 21:24 #11
Hmm.. Jeg tror at jeg holder mig til Timeren selvom det er lidt en lappeløsning :) Mange tak for de gode links - jeg studerer dem nok lidt nærmere ved en anden lejlighed.
Hvis du vil ligge et svar, så får du points'ene. Jeg vender tilbage i morgen.
Avatar billede coderdk Praktikant
14. januar 2007 - 21:47 #12
Ellers tak du, gem dem til en anden god gang :)
Avatar billede the_fox Nybegynder
15. januar 2007 - 21:03 #13
Ok mange tak!

Forresten så løste jeg mit problem ved at placere Timeren i konstructoren og beholde while i Main()
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester