Permalänk

C# Mikrosekunder

Hej, jag håller på med ett litet program i C# där jag måste använda mej av mikrosekunder, men jag kommer inte på hur man gör det? Brukar använda mej av Tread.Sleep(); men där kan man ju bara använda sej av minst 1 millisekund.
Har sökt på Msdn men jag hittar inget som hjälper mej?

En fråga till. Hur gör man om man vill att en loop ska köras i 0,5 sekunder? Har kollat lite på Environment.TickCount men har inte fått det att fungera, någon som kanske vill visa ett litet exempel? Hoppas ni förstår. Tack

Visa signatur

seriös pilsnerdrickare.

Permalänk

jag tror inte c# är rätt språk för dig om du har sådana enorma tidskrav, och windows är nog inte rätt plattform heller.

Permalänk

Ok, så det går alltså inte då?

Visa signatur

seriös pilsnerdrickare.

Permalänk
Medlem

Hej. Kort kan man säga att minsta värde för .Sleep(...) och liknande funktioner är på windowsplatformen 10-20 ms. Så om du skriver Thread.Sleep ( 5 ) eller Thread.Sleep ( 10 ) så får du samma faktiska sleeptid på mellan 10-20 beroende på vilken version av windows du använder.

Vet inte riktigt om jag förstod dig rätt när du ville köra en loop i 500ms. Nedan är en litet exempel på hur man låter loopen köras i en viss tid.

using System; using System.Runtime.InteropServices; namespace Zoomster { class Test { [ DllImport ( "kernel32.dll" ) ] extern static short QueryPerformanceCounter ( ref long x ); [ DllImport ( "kernel32.dll" ) ] extern static short QueryPerformanceFrequency ( ref long x ); [ STAThread ] static void Main ( string [ ] args ) { long counter1 = 0; long counter2 = 0; long freq = 0; /// fråga efter counter frekvens QueryPerformanceFrequency ( ref freq ); /// spara undan värde1 QueryPerformanceCounter ( ref counter1 ); // loopar i minst 500ms while ( ( ( counter2 - counter1 ) * 1000 / freq ) <= 500 ) { /// kör det du ska i loopen /// som exempel ökar jag ett värde 100k gånger for ( int i = 0; i < 100000; ++i ) ; /// spara undan värde2 för jämförelse i loopen QueryPerformanceCounter ( ref counter2 ); } Console.WriteLine("Loopen kördes i: " + ( counter2 - counter1 ) * 1000 / freq + " millisekunder."); } } }

Permalänk

Tack så mycket! Var precis så jag menade!

Ok, blir lite svårt att använda sej av mikrosekunder då.

Visa signatur

seriös pilsnerdrickare.

Permalänk
Medlem

Nja det kan man säga. Om du drar ner tiden i mitt föregånde exempel från 500ms till 5 ms och loopar hela rasket 100 gånger så ska du få se att då och då så tar den innre loopen upp till 15-20 ms istället för 5.
Så kort kan man säga att du inte har möjlighet till 'realtidsstyrning' från windows os.

Permalänk

Ja, får nog använda en mikrokontroller istället. Tack

Visa signatur

seriös pilsnerdrickare.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av zoomster
Så kort kan man säga att du inte har möjlighet till 'realtidsstyrning' från windows os.

På vilket sätt skulle man inte kunna göra det? .. räcker ju att man skriver en drivrutin med realtidsprioritet..

Permalänk
Medlem

Ja det finns alltid möjlighet till det mesta
Det var därför jag sa "Så kort kan man säga att du inte har möjlighet till 'realtidsstyrning' från windows os.".
Enkelt sagt så har en normal programutvecklare som redan i hans läge har frågor angående tidshanteringen med Thread.Sleep(), QueryPerformanceXXX etc en ganska stor uppgift framför sig.

Eftersom han inte Blake inte preciserar sig mer på vad uppgiften är så är det svårt att säga mer om vad som krävs eller behövs.

Naturligtvis kan man dyka ner i WDM, WDH etc. Start länk te.x: http://www.microsoft.com/whdc/driver/foundation/default.mspx , men det hela är inte helt enkelt med ... mindre information .. än vanligt tillgängligt.

Jag hoppas vi kan enas om att windows os inte tillhör ett os som anses vara 'realtime' även om det naturligtvis finns realtidskrav i botten. Därav mitt svar att kort så kan man inte utgå med realtidsstyrning. Naturligtvis så kan man på kernel nivå som du säger utföra uppgifter med högre precision.

Permalänk
Citat:

Ursprungligen inskrivet av MagnusL
På vilket sätt skulle man inte kunna göra det? .. räcker ju att man skriver en drivrutin med realtidsprioritet..

Du får det att låta som något man kan skriva över en eftermiddag :P.

Visa signatur
Permalänk
Medlem

Har du nåt kodexempel på sånt då MagnusL, eller du kanske inte kan skriva det själv?

Visa signatur

flippy @ Quakenet

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av ante84
Har du nåt kodexempel på sånt då MagnusL, eller du kanske inte kan skriva det själv?

eh .. i mitt inlägg så påpekade jag bara att det var _möjligt_ att lösa problemet med den metoden som jag la fram, jag sa aldrig att jag kunde göra det eller att det var enkelt. Men nu är fallet så att jag håller på att skriva ett antal Windows drivrutiner, främst WDM drivrutiner, men det är ju knappast nåt jag tänker lägga ut koden för här. Vill du ha kodexempel så finns det ett antal i DDK:n.
Har du inget vettigare för dig än att skriva dumma inlägg så kan du hålla käften.

Permalänk
Medlem

MagnusL nu blev du väl lite väl aggresiv, ante84 menade säkert inget illa.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av MagnusL
eh .. i mitt inlägg så påpekade jag bara att det var _möjligt_ att lösa problemet med den metoden som jag la fram, jag sa aldrig att jag kunde göra det eller att det var enkelt. Men nu är fallet så att jag håller på att skriva ett antal Windows drivrutiner, främst WDM drivrutiner, men det är ju knappast nåt jag tänker lägga ut koden för här. Vill du ha kodexempel så finns det ett antal i DDK:n.
Har du inget vettigare för dig än att skriva dumma inlägg så kan du hålla käften.

Vad sägs om att komma med lite realistiska förslag? Att be nån börja skriva drivrutiner som inte verkar så hemma på C# tycker inte jag låter som ett realistiskt förslag iaf.

Visa signatur

flippy @ Quakenet

Permalänk
Medlem

Ändra Thread/Process Priority

För att få mer CPU tid av schedulern i Windows kan man öka prioriteten för tråden i sig och för hela processen.
Det fungerar väl okej för att "boosta" saker som behöver lite mer CPU-tid.
Timer inne i programmet stämmer då bättre.

// finns i "kernel32.dll" hThread = GetCurrentThread(); hProcess = GetCurrentProcess(); SetThreadPriority(hThread, THREAD_PRIORITY_TIME_CRITICAL); SetPriorityClass(hProcess, REALTIME_PRIORITY_CLASS);

Permalänk
Hedersmedlem
Citat:

Ursprungligen inskrivet av MagnusL
Har du inget vettigare för dig än att skriva dumma inlägg så kan du hålla käften.

Jo det gäller dig också..