Avatar billede anders159 Nybegynder
21. marts 2006 - 10:06 Der er 5 kommentarer og
1 løsning

Threads og Monitor.

Hejsa.

Så er turen kommet til tråde, kan dog ikke lige få det til at lykkes. Mangler nok en del grundlæggende forståelse
af tråde, så dette er måske helt hen i skoven :)

skal lave en app der kan lave 2000 operationer...Dog kan der kun håndteres 10 adgangen.
Hver operation tager mellem 15 og 180 sek.

Min ide er så at lave dette med tråde, og starte alle 2000 jobs og så have dem i en threadpool.
Ved dog ikke om dette er grebet rigtigt an.

Her kommer lige lidt kode som jeg har skrevet for at lære tråde at kende og som prøver at simulere min opgave(tror jeg;).



//form..her starter jeg 1000 tråde.
namespace threadTest
{
    public partial class Form1 : Form
    {   
      private int threadNr;
     
          public Form1()
        {
            InitializeComponent();
        threadNr = 1;
        }

      private void button1_Click(object sender, EventArgs e)
      {
        ThreadPool.QueueUserWorkItem(new WaitCallback(StartJob));
      }

        public void StartJob(Object stateInfo)
        {
            for (int j = 1; j <= 100; j++)
            {
                for (int i = 1; i <= 10; i++)
                {
                    task t = new task(count);
                    threadNr++;

                    Thread th = new Thread(new ThreadStart(t.test));

                    th.Start();
                }
            }
        }

    }
}

------------------------
task. en klasse der simulere en opgave.

namespace threadTest
{
    class task
    {
        private int loops;
        private Random r = new Random();       
        private int thNr;
        myFileWriter myFw = new myFileWriter();   

        public task(int id)
        {
            this.thNr = id;
        }


        public void test()
        {           
            loops = r.Next(200000, 1000000);
           
            //logKald
            callWriter("Tråd nr->" + thNr + " start->" +
                      DateTime.Now + "-" + DateTime.Now.Millisecond + "\r\n");

                ///--> random tidsforbrug på opgaven
            //for (int i = 0; i < loops; i++)
            //{
            //    for (int j = 0; j < 300; j++)
            //    {
            //    }
            //}

            //logKald
            callWriter("Tråd nr->" + thNr + " slut-->" +
                      DateTime.Now + "-" + DateTime.Now.Millisecond + "  antal loops->" + (loops+500) + " slut->" + "\r\n");
        }

        private void callWriter(string msg)
        {           
            Monitor.Enter(myFw);
            try
            {
                Monitor.Pulse(myFw);
                myFw.writeToFile(msg);
            }
            finally
            {
                Monitor.Exit(myFw);
                myFw = null;   
            }
        }
       
    }
}
-----------------------------------
myFilewriter. Skriver log-data til fil.


namespace threadTest
{
    class myFileWriter
    {

      public void writeToFile(string msg)
        {
            FileStream fs = new FileStream("C:/udvikling/Test/thread/log.txt", FileMode.Append
                                          , FileAccess.Write);

            StreamWriter sw = new StreamWriter(fs);
            sw.Write(msg);
            sw.Close();
        }
    }

}

----------------------------------------------

Og hvad er så lige mit problem.

Det hele kørte fint, sålænge jeg kun havde en lykke omkring StartJob() i buttonClick
og ikke hvade udkommenteret dobbelt lykken i task klassen.

Men for at presse det hele lidt, udkommenterede jeg dobbelt lykken og sattet et ekstra loop om StartJob(), så
der virkelig ville komme gang i garnforretningen....og det gjorde der så.

når jeg køre det, får jeg en fejl i myFileWriter, der siger at der ikke er tilgang til filen, da den er i brug
af en anden process..

Og det burde vel også være rigtigt, hvis ikke det lige var for monitor..Burde den ikke styre det?.

Ved heller ikke om jeg bruger TreadPool rigtigt, eller om jeg bare er i nærheden af at gribe denne problem stiling
rigtigt an. Er det rigtigt at bruge monitor?

Håber nogen har lidt tid og kan oversku mit problem.....og selvfølgelig hjælpe lidt:)
Avatar billede anders159 Nybegynder
21. marts 2006 - 10:30 #1
task t = new task(count);
skal selvfølgelig være
task t = new task(threadNr);
Avatar billede sovsekoder Nybegynder
21. marts 2006 - 15:21 #2
det er rigtigt at monitor klarer dine tråd problemer, men du skal lave en monitor på et object der er fælles for alle tråde for at blokkere.

aktuelt er dit problem at du opretter en ny instans for hver eneste task klasse:

//taget fra toppen af "task" klassen
myFileWriter myFw = new myFileWriter();   

Din monitor vil virke hvis du giver en reference med til en filewriter når du opretter task klassen. myFileWriter skal derfor oprettes i metoden StartJob. (husk at fjerne linien, der sætter myFW=null i callWriter)
Avatar billede sovsekoder Nybegynder
21. marts 2006 - 15:23 #3
...så startjob metoden ser således ud:
public void StartJob(Object stateInfo)
        {
            myFileWriter myFw = new myFileWriter();   
            for (int j = 1; j <= 100; j++)
            {
                for (int i = 1; i <= 10; i++)
                {
                    task t = new task(count, myFw);
                    threadNr++;

                    Thread th = new Thread(new ThreadStart(t.test));

                    th.Start();
                }
            }
        }
Avatar billede sovsekoder Nybegynder
21. marts 2006 - 15:24 #4
starten af din task klasse vil se således ud:
class task
    {
        private int loops;
        private Random r = new Random();       
        private int thNr;
        myFileWriter myFw;

        public task(int id, myFileWriter myFw)
        {
            this.myFw = myFw;
            this.thNr = id;
        }
Avatar billede anders159 Nybegynder
22. marts 2006 - 09:16 #5
tak for indsatsen :)

Fik løst den, Men vil ger kvittere med nogle points alligevel :)

såsmid et svar.
Avatar billede sovsekoder Nybegynder
22. marts 2006 - 10:58 #6
svar. - godt at høre!
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