Avatar billede microjet Nybegynder
26. juni 2009 - 14:04 Der er 4 kommentarer og
1 løsning

Thread - TimeCritical priority... hvordan gør man det?

Hejsa
Jeg har en metode"COMRead" der kaldes hver gang der er data på comporten. Metoden køre i en thread, MEN higest priority er ikke nok. Hvis der køre virusscan påvirker det rigtig meget læsning af comporten.

  COMReadThread = new Thread(COMRead);
  COMReadThread.Priority = ThreadPriority.Highest;
  COMReadThread.Start();

Jeg har læst mig frem til at man kan sætte Threaad priority endnu højere. Higest = 26 TimeCritical = 31... dvs max!

Hvordan sætter jeg priority til timecritical??

Det er vist noget med DllImport af Kernel32, men det ville være super hvis der var en der kunne give et eks. på hvordan man skal gøre.

M.v.h

Tue


Jeg har fundet et par link:
http://geekswithblogs.net/SAmburan/archive/2008/09/04/give-your-thread-the-highest-priority-using-c.aspx

http://programmingincsharp.blogspot.com/2008/09/how-to-give-your-thread-highest.html

http://msdn.microsoft.com/en-us/library/ms685100(VS.85).aspx
Avatar billede junl Nybegynder
26. juni 2009 - 18:44 #1
Måske

[DllImport("Kernel32.dll", ExactSpelling = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetThreadPriority(IntPtr hThread, int nPriority);

[DllImport("Kernel32.dll", ExactSpelling = true)]
public static extern IntPtr GetCurrentThread();

internal const int THREAD_MODE_BACKGROUND_BEGIN = 0x10000;

og så på tråden:
IntPtr hThread = GetCurrentThread();
SetThreadPriority(hThread, THREAD_MODE_BACKGROUND_BEGIN);

Du skal så bruge time critical priority i stedet - kan du se her:
http://msdn.microsoft.com/en-us/library/ms686277(VS.85).aspx
Avatar billede microjet Nybegynder
26. juni 2009 - 20:00 #2
Det er altså stadig rimelig sort snak for mig!

Jeg har læst det link på msn... meen jeg forstår ikke hvordan jeg skal gøre i mit eks.

Jeg har som sagt en metode "COMRead" der skal køre i en TimeCritical tråd!

Men jeg forstår ike hvordan det skal gøres
Avatar billede junl Nybegynder
28. juni 2009 - 17:48 #3
Når du kalder thread.start() eksekveres din COMRead metode. Dll imports og const'en erklærer du øverst i klassen og så putter du linierne:

IntPtr hThread = GetCurrentThread();
SetThreadPriority(hThread, THREAD_MODE_BACKGROUND_BEGIN);

ind i din COMRead metode.

Hvorfor skal du egentlig have prioritet på din tråd? Virker det ikke med et SerialPort object og så lytte på eventen DataReceived?
Avatar billede microjet Nybegynder
29. juni 2009 - 10:52 #4
Tak junl

Det blev straks mere forståeligt.. det vil jeg straks forsøge!

Jeg får helt præcis 1980 målinger/sek, som er 9 bytes lange, så der er ikke ret meget spiltid mellem målingerne på 230400 baud.

Hvis jeg køre tråden i "normal" prioritet og virusscanning starter i baggrunden, så daler datamængden til under 100 målinger og køre op og ned mellem ca 100 og 800 målinger, Windows laver altså en anden buffer til data og bruger ikke comportens, som jo er begrænset til eks. 4096 bytes. Det har ingen effekt at jeg øger denne buffer.

Men hvis jeg sætter trådens prioritet til "higest" og starter virusscanning, køre det rimeligt. men data kommer i bølger, men følger dog med... bare ikke realtime.

Data kommer i bølger af 800 - 4000/sek. Derfor tror jeg at jeg kan komme tættere på realtime ved at køre et endnu højere prioritets level.
Avatar billede microjet Nybegynder
29. juni 2009 - 11:32 #5
****************************************************************
Øverst i klassen:

[DllImport("Kernel32.dll", ExactSpelling = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetThreadPriority(IntPtr hThread, int nPriority);

[DllImport("Kernel32.dll", ExactSpelling = true)]
public static extern IntPtr GetCurrentThread();

internal const int THREAD_PRIORITY_TIME_CRITICAL = 31;



Thread COMReadThread = null;



*****************************************************************
I metoden:
COMReadThread = new Thread(COMRead);
COMReadThread.Start();

*****************************************************************

Det havde ingen effekt... Hvis jeg f.eks tager et vindu og bevæger det rundt på skærmen, falder antallet af målinger der modtages til næsten nul!!!

Det er desuden fulstændig lige meget hvad jeg sætter konstanten THREAD_PRIORITY_TIME_CRITICAL til... det har ingen virkning om den er 10 eller 1000000 !!!

Så jeg tror der mangler noget
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