Avatar billede mungojerrie Nybegynder
23. marts 2005 - 15:01 Der er 13 kommentarer og
1 løsning

StreamReader og Thread

Hej

Jeg har bare lige et par spg omkring ovenstående emner (to uafhængige spg)

Jeg har benyttet en streamreader til at læse ind fra en txt fil, som er placeret på et netværksdrev og jeg kan se det går ret langsomt med at læse fra txt filen. Skyldes at en stream reader ikke arbejder med data i RAM´en eller ??

Jeg har ligeledes en thread der læser fra en mappe, hvert 10. sekund og hvis der findes noget i den mappe, skal tråden behandle data og den behandling kan godt tage over 10 sekunder, så jeg kan se at den læser igen efter 10 sekunder, også selvom behandling af de fundne data ikke er afsluttet. Er det mig der gør noget forkert eller skal det virke sådan ??
Avatar billede arne_v Ekspert
23. marts 2005 - 15:03 #1
re 1)

En StreamReader ville jeg tro bufferede noget. Men jeg ved ikke hvor meget.

re 2)

Hvis det er en timer, så skal den virke sådan.
Avatar billede mungojerrie Nybegynder
23. marts 2005 - 15:20 #2
koden for min thread ses her:

ThreadStart importFolderWorker = new ThreadStart(FolderWatcher.ReadImportFolder);
Thread importFolderThread = new Thread(importFolderWorker);
importFolderThread.Start();           

while(true)
{
    Thread.Sleep(10000); //sleep for 10 sec
    FolderWatcher.ReadImportFolder();
}

Det er jo ikke en timer :-)
Avatar billede arne_v Ekspert
23. marts 2005 - 15:33 #3
No.

den burde køre hver 10 sekunder + den tid det tager at lave ReadImportFolder
Avatar billede mungojerrie Nybegynder
23. marts 2005 - 15:49 #4
så du mener den virker som den skal ??
Avatar billede arne_v Ekspert
23. marts 2005 - 16:03 #5
Jeg kan ikke rigtigt få koden og din beskrivelse af hvad der sker til at
passe sammen

Med den kode så burde det gå f.eks. 12, 14 og 13 sekunder mellem start hvis
ReadImportFolder tog 2, 4 og 3 sekunder.
Avatar billede mungojerrie Nybegynder
23. marts 2005 - 17:12 #6
okay, jeg skal poste noget mere kode efter påske :-)
Avatar billede mungojerrie Nybegynder
04. april 2005 - 15:44 #7
Hej Arne

Så har jeg kigget lidt mere på de her tråde og nedenstående kode, mener jeg, ikke virker efter hensigten....

using System;
using System.Threading;

namespace TestApp
{

    class TestApp
    {
        public static void test()
        {
            Console.WriteLine("tråd sov! " + DateTime.UtcNow.ToString());
            Thread.Sleep(10000);
            Console.WriteLine("tråd vågn! " + DateTime.UtcNow.ToString());
        }

        public void StartThread()
        {
            ThreadStart Worker = new ThreadStart(TestApp.test);
            Thread WorkerThread = new Thread(Worker);
            WorkerThread.Start();           
            Console.WriteLine("tråd start " + DateTime.UtcNow.ToString());
           
            while(true)
            {
                Thread.Sleep(5000);
                TestApp.test();
            }
        }
       
        [STAThread]
        static void Main(string[] args)
        {
            TestApp app = new TestApp();
            app.StartThread();
        }
    }
}

Når programmet kører bliver der udskrevet:

tråd start 04/04/2005 13:45:21
tråd sov! 04/04/2005 13:45:21
tråd sov! 04/04/2005 13:45:26
tråd vågn! 04/04/2005 13:45:31
tråd vågn! 04/04/2005 13:45:36
tråd sov! 04/04/2005 13:45:41
tråd vågn! 04/04/2005 13:45:51
tråd sov! 04/04/2005 13:45:56

og hvis det virkede som det skulle, burde den ikke udskrive "tråd sov" to gange i træk.......eller er det mig der tager fejl ??
Avatar billede arne_v Ekspert
04. april 2005 - 16:09 #8
Hvorfor ikke ?

Du har 2 tråde kørende som begge laver:
  start
  sov 10 sek.
  stop
og det er vel ikke overraskende at det giver:
  tråd 1 start
  tråd 2 start
  tråd 1 stop
  tråd 2 stop
Avatar billede mungojerrie Nybegynder
04. april 2005 - 17:47 #9
hmm, okay jeg prøver igen med et eksempel der er identisk med mit program.....

using System;
using System.Threading;

namespace TestApp
{

    class MainClass
    {

        public void StartThread()
        {
            ThreadStart Worker = new ThreadStart(WorkerClass.DoWork);
            Thread WorkerThread = new Thread(Worker);
            WorkerThread.Start();           
            Console.WriteLine("tråd start " + DateTime.UtcNow.ToString());
           
            while(true)
            {
                Thread.Sleep(5000);
                WorkerClass.DoWork();
            }
        }
       
        [STAThread]
        static void Main(string[] args)
        {
            MainClass mc = new MainClass();
            mc.StartThread();
        }
    }
}


using System;

namespace TestApp
{
    /// <summary>
    /// Summary description for test.
    /// </summary>
    public class WorkerClass
    {
        public WorkerClass()
        {
            //
            // TODO: Add constructor logic here
            //
        }

        public static void DoWork()
        {
            Console.WriteLine("tråd arbejd start! " + DateTime.UtcNow.ToString());
            long k = 0;
            for(long i=0; i<=1000000000; i++)
            {
                k = i;
            }
            Console.WriteLine(k);
            Console.WriteLine("tråd arbejd slut! " + DateTime.UtcNow.ToString());
        }

    }
}


Programmet giver følgende output:

tråd start 04-04-2005 15:42:09
tråd arbejd start! 04-04-2005 15:42:09
tråd arbejd start! 04-04-2005 15:42:14
1000000000
tråd arbejd slut! 04-04-2005 15:42:15
1000000000
tråd arbejd slut! 04-04-2005 15:42:20
tråd arbejd start! 04-04-2005 15:42:25

Hvordan sørger jeg for kun at ha een tråd kørende, når nu de to tråde ikke venter på hinanden ?
Avatar billede arne_v Ekspert
04. april 2005 - 18:09 #10
Du har flere muligheder:

1)  du kan bede main thread vente på at den startede tråd afslutter

2)  du kan synkronisere med lock/Monitor/Mutex
Avatar billede arne_v Ekspert
04. april 2005 - 18:10 #11
#1 er med Thread Join metoden.
Avatar billede arne_v Ekspert
10. april 2005 - 17:26 #12
OK ?
Avatar billede mungojerrie Nybegynder
12. april 2005 - 10:01 #13
jeg har ikke lige kunnet gennemskue hvordan jeg benytter Join metoden, så hvis du har et eksempel på det, ville det jo være alletiders :-)
Avatar billede arne_v Ekspert
12. april 2005 - 10:05 #14
Thread t = new Thread(new ThreadStart(noget));
t.Start();
...
t.Join();
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
Kurser inden for grundlæggende programmering

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