Hallo,
Ich habe eine Programm geschrieben, bei dem ein Thread im Hintergrund die Serielle Schnittstelle abfragt, ob auf einem Transponder-Lesegerät, ein RFID-Chip liegt.
Das Programm funktioniert einwandfrei unter Windows 8.
Nun habe ich das Programm auf einem Windows XP Rechner installiert, und schon arbeitet es anders.
Normal wird der Thread angehalten, wenn ein Transponder gefunden wurde, und dann wird per Invoke eine Methode im Main Thread aufgerufen.
Aber auf dem Windows XP Rechner scheint er den Thread nicht anzuhalten. d.h. er invoked, aber der Thread scheint weiterhin zu laufen.
Sind irgendwelche Unterschiede beim Threading mit Windows XP und Windows 8 bekannt?
Wäre super wenn mir da jemand helfen könnte, stehe ein bisschen aufm Schlauch.
Oder kann es an Unterschieden zwischen 32 und 64 Bit Betriebssystemen liegen?
Hallo ShardZero,
direkt kann ich dir leider nicht helfen, aber ob es an 32/64 bit liegt könntest du probieren indem die Anwendung explizit als x86 kompiliert wird. Das lässt sich über den "Configuration Manager" in VS einstellen.
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
wie beendest du den den Thread?
Ich hoffe nicht mit .Abort().
Real programmers don't comment their code - it was hard to write, it should be hard to understand.
Hallo ShardZero,
siehe [FAQ] Programm läuft in anderer Umgebung nicht (richtig).
Control.Invoke sollte den aufrufenden Thread auf beiden Systemen anhalten, bis die delegierte Methode vom GUI-Thread komplett durchgelaufen ist.
herbivore
Guten Morgen,
schonmal vielen Dank für die Antworten, werde das gleich direkt mal testen, und mir den Link angucken.
Ich beende den Thread, indem ich eine volatile bool Variable auf true setze, und dadurch im Thread eine while schleife beendet wird.
Ich Invoke mit "BeginInvoke" und übergebe ein Byte-Array und eine bool Variable.
Was hast Du denn für einen Reader?
Über System.IO.Ports und COM solltest Du eine Verbindung zum Reader aufbauen können. Anschließend via Event über einen neuen Chip informiert werden - nix abfragen.
Gibt auch teilweise Projekte, die man direkt nutzen kann (LibLogicalAccess); zudem müsste es wege direkt über Win32 geben.
Edit: WinSCard nennt sich die Win32 Schnittstelle.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hallo ShardZero,
eine ungünstige und wohl auch unnötige Konstruktion. Wenn der Worker-Thread auf den GUI-Thread warten soll, dann sollte man Control.Invoke und gerade nicht Control.BeginInvoke verwenden.
herbivore
Okay, vielen Dank, das werde ich dann direkt mal ändern.
Mit der Verbindung zum Reader gibt es keine Probleme, das funktioniert alles.
So, das Problem ist behoben 😃
es lag anscheinend wirklich and BeginInvoke.
Vielen Dank an alle für die schnelle Hilfe.