Avatar billede microjet Nybegynder
16. september 2009 - 12:14 Der er 13 kommentarer og
1 løsning

Hvordan får man sin tråd til at køre i REALTIME_PRIORITY_CLASS

1) Hvordan skifter man PRIORITY_CLASS i en tråd?
2) Hvordan sætter man prioritet til THREAD_PRIORITY_TIME_CRITICAL


Prøv at se listen med Process priority class:
http://msdn.microsoft.com/en-us/library/ms685100(VS.85).aspx

Alle de tråde man laver starter i NORMAL_PRIORITY_CLASS

Her link til SetPriorityClass Function:
http://msdn.microsoft.com/en-us/library/ms686219(VS.85).aspx

pt. laver jeg min tråd således:

rt = new Thread(ReadThread);
rt.Priority = ThreadPriority.Highest;
rt.Start();

Jeg vil gerne køre rt i en højere PRIORITY_CLASS og også i timecritical level.

200 point til den der kommer med et brugbart eksempel!
Avatar billede Slettet bruger
16. september 2009 - 13:19 #1
Har desværre ikke den store erfaring med trådet programmering, men måske kan du bruge dette link http://geekswithblogs.net/SAmburan/archive/2008/09/04/give-your-thread-the-highest-priority-using-c.aspx
Avatar billede microjet Nybegynder
16. september 2009 - 13:26 #2
Jeg har set siden før. Den forklare det samme som mit link til MSDN, men jeg mangler en beskrivelse af hvordan man skifter PRIORITY_CLASS og sætter ThreadPriority til THREAD_PRIORITY_TIME_CRITICAL
Avatar billede bitmatic Nybegynder
16. september 2009 - 13:27 #3
class Program
    {
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern bool SetPriorityClass(IntPtr handle, int priorityClass);

        static void Main(string[] args)
        {
            Thread t = new Thread(new ThreadStart(run));
            t.Start();
            Console.ReadLine();
            t.Abort();
        }

        static void run()
        {
            while (true)
            {
                SetPriorityClass(System.Diagnostics.Process.GetCurrentProcess().Handle, 0x0100);
                Thread.Sleep(1000);
                Console.WriteLine("Hallo");
            }
        }
    }
Avatar billede microjet Nybegynder
16. september 2009 - 14:01 #4
Hej bitmatic

Jeg tror det var noget jeg kunne bruge, men jeg har lige et par spørgsmål.

ville det gøre nogen forskel om man rykkede linien:

SetPriorityClass(System.Diagnostics.Process.GetCurrentProcess().Handle, 0x0100);

op før while(true)?


Hvordan sæter man ThreadPriority til THREAD_PRIORITY_TIME_CRITICAL i tråden t?
Avatar billede bitmatic Nybegynder
16. september 2009 - 14:57 #5
hehe... SetPriorityClass(System.Diagnostics.Process.GetCurrentProcess().Handle, 0x0100); skal selvfølgelig op før while(true). Den skal jo kun sættes en gang.

Jeg har ikke kunnet finde ud af at sætte prioriteten af tråden. Man kan åbenbart ikke få fat i et system-handle til en tråd i C#. Mit eksempel sætter prioriteten af hele processen.

Er du i øvrigt sikker på, at det er den rigtige løsning på dit problem, at sætte prioriteten i dine tråde så hårdt som du vil her.
Jeg synes ofte ens trang til at pille i prioriteter, mere er et symptom på, at der er noget andet galt i programmet.
Avatar billede microjet Nybegynder
16. september 2009 - 15:08 #6
Hvis man skal hente 2000/sec målinger fra en COM port, så har det stor indflydelse... men det er nok ikke hensigtsmæsigt at styre det alt for hårdt, for det fryser andre processer.

Man kan sætte prioriteten på tråden i alle PriorityClass i 7 niveauer idle, lowest, below_normal, normal... osv til higest, men man kan bare ikke lige vælge Time Critical

Eks:
t.Priority = ThreadPriority.Higest;

men det har du ingen ide om hvordan man gør?
Avatar billede bitmatic Nybegynder
16. september 2009 - 15:46 #7
Jeg ville lade operativsystemet om at styre prioriteterne, og så ville jeg gøre 3 ting.

1. Sørg for at du i din recieve event (jeg kunne forestille mig, at det er den tråd du prøver at give højere prioritet) ikke udfører [b]noget som helst andet end at kopiere[b/] dataene fra input bufferen over i et array du kan få fat i i dit hovedtråd.
2. Sørg for at inputbufferen på com-porten er tilstrækkelig høj, så du ikke mister data.
3. Tyg dig nu igennem dataene i ro og mag i din hovedtråd. Brug evt. en profiler (jeg kan anbefale Equatec's) til at finde flaskehalse i din performance.
Avatar billede bitmatic Nybegynder
16. september 2009 - 16:00 #8
I øvrigt ser jeg lige at følgende kode sætter processen til at køre real-time. Så fås det ikke højere. Men jeg advarer dig - Det er dømt til at give problemer :-)

        static void Main(string[] args)
        {
            Thread t = new Thread(new ThreadStart(run));
            t.Name = "Run";
            t.Start();
            Console.ReadLine();
            t.Abort();
        }

        static void run()
        {
            //Sæt processens prioritet til lavere end normal
            SetPriorityClass(System.Diagnostics.Process.GetCurrentProcess().Handle, 0x0100);

            while (true)
            {
                Thread.Sleep(1000);
                Console.WriteLine("Hallo");
            }
        }
Avatar billede bitmatic Nybegynder
16. september 2009 - 16:01 #9
Ignorer kommentaren i koden. Den skulle have været slettet.
Avatar billede Slettet bruger
16. september 2009 - 16:07 #10
Fjerner lige overvågning af denne tråd :-)
Avatar billede microjet Nybegynder
16. september 2009 - 21:05 #11
Jeg kan fortælle dig at inputbufferren ikke har den store værdi... lige meget hvad jeg sætter den til, så buffer windows mange kbytes et eller andet sted. Jeg prøvede at sætte bufferen til 4k ~ til 2sek optagelse... men den bliver ikke fyldt!

problemet opstår når virusscanneren går i gang eller andet aktivitet opstår så dykker målingerne nogle gange helt ned til under 300/sek... og bliver der indtil jeg pauser virusscanningen, herefter stiger antallet af målinger til 4-5000/sek en tid for derefter at normalisere til 2000/sek.

Hvor har windows gemt alle de data? :-) Der er nemlig ingen mistede målinger... det ligner jo bare ikke skyggen af noget der bare ligner realtime hvis man skal tegne grafer med disse data

Jeg har fået det til at virke med at skifte prioritets-klasser og det virker... man kan nemlig ikke bruge musen når den er på højeste level :-)

Men jeg har fundet et rimelig tilfredsstillende niveau, men windows ophober stadig målinger lige meget hvad jeg gør
Avatar billede microjet Nybegynder
16. september 2009 - 21:07 #12
Bare lige for at præcisere:
Jeg mister ikke data, men windows tilbageholder data.. derfor var det et forsøg værd at lege lidt med tråd prioriteter.
Avatar billede bitmatic Nybegynder
21. september 2009 - 22:22 #13
Avatar billede microjet Nybegynder
18. januar 2011 - 00:17 #14
lukket
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