WaitOne und PInvoke


Leider kann man .NET Applikationen nicht ohne weiteres von Desktop Systemen auf Comapct Framework basierte Systeme kopieren. Das CF unterstütz nicht den vollen Umfang des .NEt Frameworks. Zwei Probleme die bei der Portierung multi-thread-fähiger Applikationen auf das CF auftreten können werden im folgenden gelöst:


Die erste Falle lauert im Aufruf


System.TimeSpan yield = new System.TimeSpan(10);
System.Threading.Thread.Sleep(yield);


Das CF unterstütz den Sleep-Aufruf nicht mit einerm TimeSpan Struct als Paramter. Ein Integer ist hier die Lösung und im Handumdrehen implementiert:


System.TimeSpan ts = new System.TimeSpan(10);
int yield = ts.Milliseconds;
System.Threading.Thread.Sleep(yield);


Spannender wird es beim Aufruf der WaitOno-Methode. Diese wird im CF lediglich ohne Paramter unterstützt. Wer neben dem externen Signal auf einen timeout wartne möchte, kann dies lange tun. Eine einfache Möglichkeit bietet ein PInvoke-Aufruf:


[System.Runtime.InteropServices.DllImport(“CoreDll.dll”)]
private extern static System.Int32 WaitForSingleObject(
System.IntPtr Handle,
System.Int32 Wait);


Jetzt kann der Aufruf


foo.WaitOne((int)((bar – System.DateTime.Now.Ticks), false);


durch folgenden Dreizeiler ersetzt werden:


System.IntPtr hProcess = foo.Handle;
System.Int32 iWait = (int)((bar – System.DateTime.Now.Ticks));
WaitForSingleObject(hProcess, iWait);


Kompilieren, auf das mobile Gerät kopieren und wieder ist ein Tag gerettet.

Comments are closed.