Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von moelski
Thema: Eine Property per Referenz übergeben?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Moin !

Zitat
Man könnte da nur eine normale Referenz auf ein Objekt übergeben, dessen Properties dann geändert werden können.
Das habe ich fast befürchtet. Dann muss ich mir für mein Console Property Grid was anderes überlegen.

Danke für die Info herbivore

Thema: Eine Property per Referenz übergeben?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Moin !

Kann ich eine Klassen Property als Referenz an eine andere Klasse übergeben?
Mein Versuch dazu klappt leider nicht:

namespace refTest
{
    using System;

    class Program
    {
        static void Main()
        {
            var data = new MyData { myData = "Hello" };

            var test = new MyProp(ref data.myData);

            test.Change();

            Console.WriteLine(data.myData);
            Console.ReadKey();
        }
    }

    public class MyData
    {
        public string myData { get; set; }
    }

    public class MyProp
    {
        string Test { get; set; }

        public MyProp(ref string input)
        {
            this.Test = input;
        }

        public void Change()
        {
            this.Test += " Welt";
        }
    }
}

Hintergrund ist das ich gerne von einer Klasse in einer Konsolen App bestehende Properties ändern würde.
Mein obiges Beipsiel funktioniert so nicht. Geht das in der Form überhaupt?
Ich könnte (im obigen Beispiel) natürlich die Instanz von MyData übergeben und dann den Wert anpassen. Aber das würde mir in meinem Fall nicht helfen.

Thema: Suche (textbasiertes) PropertyGrid(artiges)-Control für reine Konsolenanwendung
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Moin !

Sehr hilfreiches Beispiel herbivore. Vielen Dank.
Es muss gar nicht mal so bunt und mit eigenem Fenster sein. Werde mir das mal vornehmen und die für mich wichtigen Teile raus ziehen.

Thema: Suche (textbasiertes) PropertyGrid(artiges)-Control für reine Konsolenanwendung
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Moin !

Danke für die Infos, nur leider ist das nicht ganz was ich brauche

Ich suche etwas mit dem ich zur Laufzeit der Command Anwendung Settings anpassen kann. Ich möchte damit Einstellungen anpassen die erst zur Laufzeit relevant sind und nicht per command Line Args übergeben werden und auch nicht mittels Settings fest vorgegeben werden können.

Ich mache mal ein fiktives Beispiel zur Verdeutlichung. Ein User möchte CSV Dateien in eine Datenbank importieren. Dabei kommen aber z.B. unterschiedliche CSV Trennzeichen vor und z.B. unterschiedliche Zeilenende.
Was ich suche wäre nun eine Klasse mit der ich Eigenschaften einstellen kann. Das könnte dann so aussehen:

CSV Trenner   ;
Zeilenende    CR/LF

Der User sollte nun z.B. mit Cursor raus / runter eine Eigenschaft auswählen können und mit links / rechts aus einer gegebenen Liste selektieren. Oder bei einem Feld wo ein Text eingegeben werden muss mittels Enter eine Texteingabe anzeigen.

Halt ähnlich wie eine PropertyGrid in GUI Anwendungen.

Thema: Suche (textbasiertes) PropertyGrid(artiges)-Control für reine Konsolenanwendung
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Moin !

Wir entwickeln eine Anwendung die über Class Libaries Geräte anbindet (bsp: Daten einer Wetterstation auslesen). Diese Libaries werden von einer WinForms Anwendung genutzt. Parallel dazu gibt es aber auch eine Consolen Applikation welche die gleichen Libaries zur Datenverarbeitung nutzt. Bis hier auch alles ok.
Nun werden aber demnächst Geräte eingebunden die konfiguriert werden können. Nehmen wir die Wetterstation um z.B. die geografische Lage vorzugeben. Dafür bekommt die Class Library einen Dialog und in der GUI Anwendung ist damit auch alles im Lot.
Jetzt bin ich am überlegen wie ich die Settings auch aus der Consolen App erreichbar machen kann. Gibt es da evtl. eine fertige Klasse die mir eine Art Property Editor auf Textebene bereitstellt? Dann müsste ich das Rad nicht komplett neu erfinden.

Thema: Win8.1 - Probleme bei HID Kommunikation wegen Power Management
Am im Forum: Rund um die Programmierung

Moin Abt,

WMI möchte ich vermeiden. Meine bisherigen Versuche waren da ncht wirklich zielführend und es ist auch im Vergleich zur API eher träge bei der Abfrage.
WDK würde sicher gehen, aber dann muss ich alles umschreiben.

Die Kommunikation an sich klappt ja sobald das Gerät wach ist. Also der Grundlegende Code passt. Es fehlt im Moment eben nur dieses eine Stückchen Code um ein Device aufzuwecken.

Thema: Win8.1 - Probleme bei HID Kommunikation wegen Power Management
Am im Forum: Rund um die Programmierung

Moin !

Wir haben unter Windows 8.1 ein Problem mit der HID kommunikation. Nach ersten Tests liegt das an den neuen Power Management Funktionen von Windows 8.1. Nicht genutzte Geräte werden sehr schnell in einen Sleep Modus gesetzt.
Im Netz gibt es dazu auch zahlreiche Fragen und auch einen Workaround:
After installing Windows 8.1, my USB device doesn't charge or it disconnects and reconnects frequently...

Ich habe nun mal ein paar Tests gemacht und bin zwar zu einer Lösung gekommen, die finde ich allerdings eher unbauchbar.

            SafeHandle handle = DsKernel.CreateFile(
                this.DevicePath,
                FileAccess.ReadWrite,
                FileShare.ReadWrite,
                IntPtr.Zero,
                FileMode.Open,
                DsKernel.FileAttributes.Overlapped,
                IntPtr.Zero);

            success = DsHidApi.HidD_GetAttributes(handle.DangerousGetHandle(), ref DeviceAttributes); 

            if (success)
            {
                this.Vid = DeviceAttributes.VendorID.ToString("X4");
                this.Pid = DeviceAttributes.ProductID.ToString("X4");
                this.Version = DeviceAttributes.VersionNumber;
                
                success = DsHidApi.HidD_GetPreparsedData(handle.DangerousGetHandle(), ref preparsedData); 
                
                DsHidApi.HIDP_CAPS Capabilities = new DsHidApi.HIDP_CAPS(); 
                Int32 result = 0;
                result = DsHidApi.HidP_GetCaps(preparsedData, ref Capabilities);

                int bufferLength = 126;
                byte[] buffer = new byte[bufferLength];

               ############## Thread.sleep(200);

                // Bei Api Call Problemem mit DsLog.ResultOfApiCall("HidD_GetManufacturerString"); abfragen
                if (DsHidApi.HidD_GetManufacturerString(handle.DangerousGetHandle(), buffer, bufferLength))
                {
                    this.Manufacturer = Encoding.Unicode.GetString(buffer).Replace("\0", string.Empty);
                }

Das ist ein Stück aus der HID Enumeration. Es geht u.a. um das Auslesen von Manufacturer, Serial Number und Product String.

Wenn ich den Code ohne das Sleep laufen lasse bekomme ich
Fehler
Fehler 31: A device attached to the system is not functioning.
Mit dem Sleep läuft die Kommunikation sauber durch und die Erkennung klappt auch.

Nun ist ein Sleep aber sicher keine Lösung. Drum meine Frage ob jemand eine saubere Lösung für dieses problem kennt. Gibt es evtl. einen Api Call um das Gerät aus dem Sleep Mode zu "befreien" oder kann ich ein Flag so lange abfragen bis das Gerät bereit für eine Kommunikation ist?

Thema: TChart - Daten aus einem Thread übergeben - nur wie?
Am im Forum: Grafik und Sound

Moin !

Ich hoffe hier gibt es ein paar TChart Nutzer die evtl. schon mal ein ähnliches Problem hatten (und gelöst haben).
Und zwar geht es um das Eintragen von Daten in Serien aus einem Thread heraus. Mein bisheriges Vorgehen war folgendes:
* Invoke auf Chart um dann für alle Serien ein Clear aufzurufen. Anschließend noch ein AutoRepaint = false
* jetzt (ohne invoke) die Serien mit Daten befüllen (series.Add(...))
* Invoke auf Chart um Autorepaint = true zu setzen und ein Refresh ausführen.

Ich bin mir nicht sicher ob das der richtige Weg ist, aber es funktioniert mal soweit. Nur wenn ich dann während dem Dateneintragen das Fenster mit dem Chart z.B. vergrößere werden die Serien trotz Autorepaint auf false gezeichnet. Und das für die bis dahin eingetragenen Daten.

Ich hatte auch schon den Fall das ein Fokusverlust der Anwendung einen Repaint ausgelöst hat während dem Dateneintragen.

Ich habe dann getestet was passiert wenn ich auch das Dateneintragen über ein Invoke ausführe. Nur leider führt das zu enormen Performance Verlusten.

Dann habe ich versucht die Problematik mittels lock zu lösen:
* Chart.BeforeDraw > Monitor.Enter(_lockObject)
* Chart.AfterDraw > Monitor.Exit(_lockObject)
* Dateneintragen in Serien gekapselt mittels lock(_lockObject){....}
Das funktioniert auch nicht wirklich. Damit ist die ganze Applikation geblockt. Ein Resize des Fensters ist z.B. nicht mehr möglich.

Kurzum, kann mir jemand ein paar Hinweise geben wie ich ein TChart aus einem Thread raus mit Daten füttern kann ohne das meine Anwendung geblockt wird?

PS: Noch frohe Weihnachten

Thema: MySQL Connector 6.5.4 auf 6.7.4 - Performence Verlust
Am im Forum: Datentechnologien

Moin !

Ich poste morgen mal ein paar meiner Queries. Gleich ist erst Nikolausfeier und Sohnemann muss stramm stehen

Zitat
Statt ständig alles abzurufen wird nun nur das abgerufen, was tatsächlich in diesem Moment gebraucht wird.
Hmm, aber da ich nur ganz normale Queries absetze rufe ich eh nur das ab was ich brauche.

Wie auch immer ... Ich poste morgen mal ein paar meiner Abfragen. Dann schauen wir weiter.

Thema: MySQL Connector 6.5.4 auf 6.7.4 - Performence Verlust
Am im Forum: Datentechnologien

Moin Abt,

soweit sogut, aber ich nutze das EF nicht. Ich nutze in meiner Anwendung nur ganz normale Abfragen mittels Command + Reader. Und die Queries sind nichtmal sonderlich kompliziert. Es gibt so gut wie keine verketteten / verschachtelten Queries. Im Grunde nutze ich nicht viel mehr als ein paar sehr einfache Inserts und Selects die sich immer nur auf eine Tabelle beziehen. So ganz genau wüsste ich nicht was ich da optimieren soll.

Ich könnte ja auch noch nachvollziehen das es wegen der EF Anpassungen in Summe etwas langsamer wird. Aber in dem Masse kann ich das nicht nachvollziehen.

Muss ich evtl. mein Connection String was mit angeben was bei 6.5.4 mitunter nicht nötig war?

Und mir fällt gerade noch was ein. Ich habe mal testhalber den MySQL Connector von DevArt verwendet. Damit war ein Grossteil um Faktor 2 schneller als mit dem normalen MySQL Connector...

Thema: MySQL Connector 6.5.4 auf 6.7.4 - Performence Verlust
Am im Forum: Datentechnologien

verwendetes Datenbanksystem: MySQL 5.5.28

Moin !

Ich nutze für unsere Applikation den MySQL Server 5.5.28. Und als MySQL Connector bis dato immer die Version 6.5.4. Nun musste ich VS2012 neu installieren und wollte damit auch den Connector auf die aktuelle Version heben (6.7.4).

Soweit hat das auch alles geklappt, nur ist dadurch alles furchtbar träge geworden. Teilweise 50-100x langsamer (wenn ich mal mein Logging dazu betrachte). Habe dann 6.7.4 wieder deinstalliert und 6.5.4 wieder drauf gemacht. Und schon habe ich wieder die gewohnte Geschwindigkeit.

Hat jemand ähnliches beobachtet? Und gibt es dafür eine Erklärung?

Thema: HID : 997 overlapped i/o operation is in progress Fehlermeldung
Am im Forum: Rund um die Programmierung

Moin die Herren,

ich denke ich kann zum einen eine Lösung aufzeigen und zum anderen auch (hoffentlich) ein paar
Details erklären ..

Fangen wir mit letzterem an ...
Ich glaube man darf den windows Fehler 997 nicht als Fehler betrachten sondern nur als Hinweis :tongue: Und wenn man sich mal genau den fehlertext ansieht "Overlapped I/O Operation Is in Progress" wird auch klar warum. Die Meldung besagt ja nur das eine Overlapped Operation noch am Werken ist. Nicht mehr und nicht weniger. Auf mein Problem gemünzt bedeutet dass das Schreiben oder das Lesen noch nicht zu Ende ist.

Ich bin dann im Netz über die Win Funktion GetOverlappedResult gestolpert. Und irgendwann hatte ich dann wieder mein geschätztes Buch "USB Complete 4th Edition" auf dem Tisch. Und siehe da ... Dort wird das lesen und Schreiben von HID Reports ganz anders gehandhabt nämlich über WriteFile und ReadFile.
Und bei ReadFile gab es dann auch ein Beispiel wie man denn auf den Fehler 997 reagiert. Dort wird ein Event verwendet das durch ReadFile getriggert wird und letztlich einen Timeout liefert oder eben das komplette Ergebnis.

Ich habe das dann mal in eine Demo gegossen und siehe da ... es gibt zwar noch 997 Meldungen, aber die sind auch logisch denn wenn keine daten kommen kann der lesevorgang nicht abgeschlossen werden. Das führt dann zu einem Timeout und das Spiel geht von vorne los.

Wenn ich die Testanwendung unter Win32 XP laufen lasse habe ich noch ein kleines Problem. Dort sagt er mir den Fehler 3 "The system cannot find the path specified.". Das verstehe ich noch nicht ganz zumal die Daten sauber weggeschrieben werden und WriteFile auch Success meldet.
Vielleicht hat da jemand eine Idee.


Aber das grundproblem mit Fehler 997 scheint gelöst (oder sagen wir mal verstanden).

Hier noch meine aktuelle Testapp auf das Wesentliche gestrippt:

namespace HIDTest997
{
    using System;
    using System.ComponentModel;
    using System.Runtime.InteropServices;
    using System.Threading;

    using Microsoft.Win32.SafeHandles;

    class Program 
    {
        private const string strPath = @"\\?\hid#vid_04d8&pid_fd93#9&32d3c4cd&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}";
        //  private const string strPath = @"\\?\hid#vid_04d8&pid_fd93#6&21343d7a&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}";
        
        #region Sniffer Stuff

        private static SafeFileHandle readHandle;
        private static SafeFileHandle writeHandle; 

        private static int m_nInputReportLength;

        internal const Int32 FILE_FLAG_OVERLAPPED = 0X40000000;
        internal const Int32 FILE_SHARE_READ = 1;
        internal const Int32 FILE_SHARE_WRITE = 2;
        internal const UInt32 GENERIC_READ = 0X80000000;
        internal const UInt32 GENERIC_WRITE = 0X40000000;
        internal const Int32 INVALID_HANDLE_VALUE = -1;
        internal const Int32 OPEN_EXISTING = 3;
        internal const Int32 WAIT_TIMEOUT = 0X102;
        internal const Int32 WAIT_OBJECT_0 = 0;    

        [DllImport("kernel32.dll", SetLastError = true)]
        internal static extern Int32 CancelIo(SafeFileHandle hFile);

        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        internal static extern IntPtr CreateEvent(IntPtr SecurityAttributes, Boolean bManualReset, Boolean bInitialState, String lpName);

        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        internal static extern SafeFileHandle CreateFile(String lpFileName, UInt32 dwDesiredAccess, Int32 dwShareMode, IntPtr lpSecurityAttributes, Int32 dwCreationDisposition, Int32 dwFlagsAndAttributes, Int32 hTemplateFile);

        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        internal static extern Boolean GetOverlappedResult(SafeFileHandle hFile, IntPtr lpOverlapped, ref Int32 lpNumberOfBytesTransferred, Boolean bWait);

        [DllImport("kernel32.dll", SetLastError = true)]
        internal static extern Boolean ReadFile(SafeFileHandle hFile, IntPtr lpBuffer, Int32 nNumberOfBytesToRead, ref Int32 lpNumberOfBytesRead, IntPtr lpOverlapped);

        [DllImport("kernel32.dll", SetLastError = true)]
        internal static extern Int32 WaitForSingleObject(IntPtr hHandle, Int32 dwMilliseconds);

        [DllImport("kernel32.dll", SetLastError = true)]
        internal static extern Boolean WriteFile(SafeFileHandle hFile, Byte[] lpBuffer, Int32 nNumberOfBytesToWrite, ref Int32 lpNumberOfBytesWritten, IntPtr lpOverlapped); 

        #endregion
        
        static void Main(string[] args)
        {
            Thread InOutThread = new Thread(DoInOut) { Name = "HID IO Thread" };
        //    this.ContinueThread = true;

            InOutThread.Start();

            byte[] send = new byte[65];
            send[1] = 2;

            writeHandle = CreateFile(strPath, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, 0, 0);
            if (!writeHandle.IsInvalid)
            {
                Int32 numberOfBytesWritten = 0;
                Boolean success = false; 

                try
                {
                    m_nInputReportLength = 65;
                    success = WriteFile(writeHandle, send, send.Length, ref numberOfBytesWritten, IntPtr.Zero);
                    Console.WriteLine("WriteFile success = " + success + " " + numberOfBytesWritten);

                    success = WriteFile(writeHandle, send, send.Length, ref numberOfBytesWritten, IntPtr.Zero);
                    Console.WriteLine("WriteFile success = " + success + " " + numberOfBytesWritten);

                    if (!success)
                    {
                        if (!writeHandle.IsInvalid)
                        {
                            writeHandle.Close();
                        }
                    } 
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Failed to get the detailed data from the hid.");
                }
            }
            else 
            {
                Console.WriteLine("Handle Invalid");
            }

            Console.ReadKey();
        }

        private static void DoInOut()
        {
            readHandle = CreateFile(strPath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);

            IntPtr eventObject = IntPtr.Zero;
            NativeOverlapped HidOverlapped = new NativeOverlapped();
            IntPtr nonManagedBuffer = IntPtr.Zero;
            IntPtr nonManagedOverlapped = IntPtr.Zero;
            Int32 numberOfBytesRead = 0;
            Int32 result = 0;

            var inputReportBuffer = new Byte[65]; 

            while (true)
            {
                try
                {
                    //  Set up the overlapped structure for ReadFile.

                    eventObject = CreateEvent(IntPtr.Zero, false, false, "");

                    HidOverlapped.OffsetLow = 0;
                    HidOverlapped.OffsetHigh = 0;
                    HidOverlapped.EventHandle = eventObject;    

                    // Allocate memory for the input buffer and overlapped structure. 

                    nonManagedBuffer = Marshal.AllocHGlobal(inputReportBuffer.Length);
                    nonManagedOverlapped = Marshal.AllocHGlobal(Marshal.SizeOf(HidOverlapped));
                    Marshal.StructureToPtr(HidOverlapped, nonManagedOverlapped, false);

                    ShowError("Befor Read");
                    var success = ReadFile(readHandle, nonManagedBuffer, inputReportBuffer.Length, ref numberOfBytesRead, nonManagedOverlapped);
                    ShowError("After Read");

                    if (!success)
                    {
                        Console.WriteLine("waiting for ReadFile");

                        result = WaitForSingleObject(eventObject, 3000);

                        switch (result)
                        {
                            case WAIT_OBJECT_0:

                                //  ReadFile has completed

                                success = true;
                                Console.WriteLine("ReadFile completed successfully.");

                                GetOverlappedResult(readHandle, nonManagedOverlapped, ref numberOfBytesRead, false);

                                break;

                            case WAIT_TIMEOUT:

                                //  Cancel the operation on timeout

                                //CancelTransfer(hidHandle, readHandle, writeHandle, eventObject);
                                Console.WriteLine("Readfile timeout");
                                success = false;
                                break;
                            default:

                                //  Cancel the operation on other error.

                                //CancelTransfer(hidHandle, readHandle, writeHandle, eventObject);
                                Console.WriteLine("Readfile undefined error");
                                success = false;
                                break;
                        }
                    }

                    if (success)
                    {
                        // A report was received.
                        // Copy the received data to inputReportBuffer for the application to use.

                        Marshal.Copy(nonManagedBuffer, inputReportBuffer, 0, numberOfBytesRead);

                        string hex = BitConverter.ToString(inputReportBuffer).Replace("-", " ");
                        Console.WriteLine(hex);
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    throw;
                }    
            }
        }

        private static void ShowError(string addon)
        {
            int lastWin32Error = Marshal.GetLastWin32Error();
            if (lastWin32Error != 0)
            {
                string win32ErrorMessage = new Win32Exception(lastWin32Error).Message;
                Console.WriteLine("[{2}] {0} (ErrorID : {1})", win32ErrorMessage, lastWin32Error, addon);
            }
            else
            {
                Console.WriteLine("[{0}] OK", addon);
            }
        }
    }
}

Thema: HID : 997 overlapped i/o operation is in progress Fehlermeldung
Am im Forum: Rund um die Programmierung

Es ist zum Haare raufen. Beim USB Sniffer von CodeProject habe ich jetzt auch den 997 Fehler.
X(

Langsam habe ich keine Ideen mehr.
Hast du evtl. noch einen Tip herbivore?

Updates:
Ich habe jetzt mal die 32Bit Version auf XP getestet. Dort kriege ich den 997 nicht.
Weiterhin habe ich die UAC auf meinem Win7 64Bit mal ausgeschaltet. Hat aber auch nichts genutzt.

Thema: HID : 997 overlapped i/o operation is in progress Fehlermeldung
Am im Forum: Rund um die Programmierung

Aha, jetzt wird ein Schuh draus
Werde ich heute Abend testen. Habe jetzt erst Kinderdienst und Sankt Martin vor der Brust :tongue:

Nachtrag:
Ich fürchte das ist es auch nicht. Denn wenn ich bei BeginAsyncRead und ReadCompleted einen Breakpoint setze, dann komme ich da auch nur an wenn Daten ankommen. Eine Endlos Loop kann ich da nicht entdecken.
Und die Umsetzung bei dem CodeProject Sample hat das auch genau so implementiert wie oben gezeigt.

Thema: HID : 997 overlapped i/o operation is in progress Fehlermeldung
Am im Forum: Rund um die Programmierung

Moin !

Zitat
also das der Auruf der Methode BeginAsynRead() eine Endlosschleife aufbaut, die andauernd ohne Pause liest ist dir klar, oder?
Nein bis jetzt nicht. Warum sollte da eine Endlosschleife entstehen? Das Device sendet nur auf Anfrage. Und wenn mehrere Pakete kommen sollen die ja auch gelesen werden.

Ich nutze doch gerade BeginAsynRead / ReadComplete damit der Empfang möglichst im Hintergrund abläuft.
Zitat
Vielleicht schreibt zur selben Zeit auch das HID.
Def. nein. Das meldet sich nur auf Anfrage.

Thema: HID : 997 overlapped i/o operation is in progress Fehlermeldung
Am im Forum: Rund um die Programmierung

Moin !

Ich verstehe es nicht. Es gibt auf CodeProject dieses Sample:
A USB HID Component for C#

Wenn ich die Testanwendung starte klappt alles super. Ich bekomme keine Fehler beim Schreiben.

Nun habe ich den minimalen Code aus der Application rausgezogen der nötig wäre um mit einem HID Device zu kommunizieren. Im Grunde nur ein Kommando hinschicken und das ergebnis empfangen.
Der DevicePath ist hard codiert ...

Hier mal der Code:

namespace HIDTest997
{
    using System;
    using System.ComponentModel;
    using System.IO;
    using System.Runtime.InteropServices;

    using Microsoft.Win32.SafeHandles;

    class Program
    {
        #region Sniffer Stuff

        private static IntPtr m_hHandle;
        private static FileStream m_oFile;
        private static int m_nInputReportLength;

        /// <summary>CreateFile : Open file for read</summary>
        protected const uint GENERIC_READ = 0x80000000;
        /// <summary>CreateFile : Open file for write</summary>
        protected const uint GENERIC_WRITE = 0x40000000;
        /// <summary>CreateFile : Resource to be "created" must exist</summary>
        protected const uint OPEN_EXISTING = 3;
        /// <summary>CreateFile : Open handle for overlapped operations</summary>
        protected const uint FILE_FLAG_OVERLAPPED = 0x40000000;
        /// <summary>Simple representation of the handle returned when CreateFile fails.</summary>
        protected static IntPtr InvalidHandleValue = new IntPtr(-1);

        [DllImport("kernel32.dll", SetLastError = true)]
        protected static extern IntPtr CreateFile([MarshalAs(UnmanagedType.LPStr)] string strName, uint nAccess, uint nShareMode, IntPtr lpSecurity, uint nCreationFlags, uint nAttributes, IntPtr lpTemplate);

        #endregion

        static void Main(string[] args)
        {
            string strPath = @"\\?\hid#vid_04d8&pid_fd93#8&2a005973&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}";
            
            m_hHandle = CreateFile(strPath, GENERIC_READ | GENERIC_WRITE, 0, IntPtr.Zero, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, IntPtr.Zero);

            if (m_hHandle != InvalidHandleValue || m_hHandle == null)
            {
                try
                {
                    m_nInputReportLength = 65; 

                    m_oFile = new FileStream(
                        new SafeFileHandle(m_hHandle, false),
                        FileAccess.Read | FileAccess.Write,
                        m_nInputReportLength,
                        true);

                    BeginAsyncRead(); // kick off the first asynchronous read                              
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Failed to get the detailed data from the hid.");
                }
            }
            else 
            {
                m_hHandle = IntPtr.Zero;
                Console.WriteLine("Failed to create device file");
            }

            byte[] send = new byte[65];
            send[1] = 2;

            ShowError("Befor Write");

            try
            {
                m_oFile.Write(send, 0, 65);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            
            ShowError("After Write");

            Console.ReadKey();
        }

        private static void BeginAsyncRead()
        {
            byte[] arrInputReport = new byte[m_nInputReportLength];

            ShowError("Befor Read");
            
            try
            {
                m_oFile.BeginRead(arrInputReport, 0, m_nInputReportLength, new AsyncCallback(ReadCompleted), arrInputReport);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            
            ShowError("After Read");
        }

        protected static void ReadCompleted(IAsyncResult iResult)
        {
            byte[] arrBuff = (byte[])iResult.AsyncState;	// retrieve the read buffer
            try
            {
                m_oFile.EndRead(iResult);
                try
                {
                    string hex = BitConverter.ToString(arrBuff).Replace("-", " ");
                    Console.WriteLine(hex);
                }
                finally
                {
                    BeginAsyncRead();
                }
            }
            catch (IOException ex)	// if we got an IO exception, the device was removed
            {
                Console.WriteLine("Error IO");
            }
        }

        private static void ShowError(string addon)
        {
            int lastWin32Error = Marshal.GetLastWin32Error();
            if (lastWin32Error != 0)
            {
                string win32ErrorMessage = new Win32Exception(lastWin32Error).Message;
                Console.WriteLine("[{2}] {0} (ErrorID : {1})", win32ErrorMessage, lastWin32Error, addon);
            }
            else
            {
                Console.WriteLine("[{0}] OK", addon);
            }
        }
    }
}

Wenn ich die App Starte dann kommt irgendwann BeginAsyncRead. "Befor Read" liefert noch 0 als Error. Aber sobald das BeginRead durchlaufen wurde kriege ich den 997. Und das obwohl der Code 1:1 kopiert ist aus der Testanwendung von Codeproject. Ich verstehe es gerade nicht

Wenn ich das BeginAsyncRead auskommentiere dann sollte er ja nur noch das Kommando senden. Aber auch hier kriege ich bei After Write den 997.
Zitat
immer sauber Dispose()
Im Moment noch nicht. Denn ich möchte ja das Handle und den FileStream nutzen und nicht löschen. Aber du hast Recht. Das muss ich auf jeden Fall noch ergänzen. Hilft aber auch nicht bei meinem Problem - schon getestet.
Zitat
bzw. Flush()
Flush hift nicht. Habe ich auch noch bei keiner HID umsetzung gesehen dass das wer genutzt hätte.

So ich hoffe der Code ist kurz genug =) und evtl. kann jemand den großen misteriösen Bug sehen.
Kann doch nicht sein das es an der Consolen App hängt, oder?
Wobei den Fehler 997 hatte ich auch schon in einer WinForms Anwendung.

Thema: HID : 997 overlapped i/o operation is in progress Fehlermeldung
Am im Forum: Rund um die Programmierung

Moin !

Zitat
Ich denke mal zum Lesen und Schreiben in den Stream benutzt du den BinaryReader/Writer. Sobald eine dieser Klassen am Stream ist ( ist sie ab Instanzierung ) kann keine andere Klasse den Stream nutzen.
Ich kann deinen Vorschlag heute Abend mal testen. Aber vorab mal hierzu...
Was ich dann aber nicht verstehe warum es mit dem UI Thread (schreiben) und einem Pool Thread (lesen mittels Async) funktioniert, nicht aber mit einem eigenen Thread für Schreiben.
Zitat
Interessehalber, über was für ein HID reden wir?
Unterschiedliche ... z.B.
Hitec HTS-Navi 2.4GHz USB Telemetry Receiver
IISI Cockpit

PS: Wäre es ok wenn ich hier mal meine HID Klasse einstelle? Vielleicht sieht ja jemand auf den ersten Blick des Pudels Kern und kann dazu was sagen?

Thema: HID : 997 overlapped i/o operation is in progress Fehlermeldung
Am im Forum: Rund um die Programmierung

Moin !

Zitat
Ich denke du solltest probieren ead zum die Threads zu synchronisieren.
Wie könnte ich das angehen? Der Fehler tritt beim Schreiben auf. Und ich schreibe nur einen Output Report mit 65 Byte raus.
Das würde bedeuten dass das Gerät schon mit dem Senden anfängt ohne das der gesamte Report empfangen wurde.
Wie könnte ich den Asynchronen Read denn so lange blocken bis mein Schreibvorgang durch ist ?
Zitat
bei einem Human Interface Device sollten die Datenmengen eher gering sein.
Sind sie ja im Grunde auch. Das Problem habe ich schon direkt beim ersten Report. Und die Menge der Daten kann ich im Übrigen gar nicht beeinflussen da vom Gerät vorgegeben.
Zitat
Warum willst du überhaupt aus einem anderen Thread darauf zugreifen?
Ich hätte gerne den Thread für HID Handling getrennt vom UI. Ob das nun zwingend notwendig ist sei mal dahin gestellt. Aber es sollte im Grunde doch funktionieren !?
Zitat
Mir erscheint es ratsam, nur aus dem GUI-Thread auf das HID zu zugreifen ... so wie es das HID von dir scheinbar auch will.
Müsste es dem HID Device nicht Schnuppe sein von wo die Daten kommen? Auch eine serielle Schnittstelle arbeitet in einem eigenen Thread bezüglich Datenkommunikation. Das sollte bei HID auch klappen.

Nachtrag ...
Ich habe jetzt mal das BeginAsyncRead(); auskommentiert. Bedeutet ja das er erst gar nicht versucht Daten zu lesen. Selbst dann bekomme ich den Fehler 997.

Thema: HID : 997 overlapped i/o operation is in progress Fehlermeldung
Am im Forum: Rund um die Programmierung

Moin !

Ich habe mir eine Klasse geschrieben um mit einem HID Device zu kommunizieren. Nur leider stoße ich dabei auf ein Problem beim Daten senden:

Fehler
997 overlapped i/o operation is in progress

Der Datenempfang läuft über ein Asynchrones Lesen mittels BeginAsyncRead / ReadCompleted. Das funktioniert auch ohne Probleme.
Das Daten Senden wollte ich auch über einen eigenen Thread lösen. Doch sobald ich die Daten schicke bekomme ich eben den oben genannten Fehler. (Die Daten werden zum Senden in eine Queue eingetragen, der Thread über EventWaitHandle angestoßen und dann die Daten gesendet)
Sende ich die Daten aus dem UI Thread direkt klappt alles anstandslos.

Muss ich aufgrund des asynchronen Lesens evtl. Lesen und Schreiben gegeneinander sperren?

Kann mir evtl. jemand einen Tip geben woren das liegen könnte?

Thema: (Schnellste) Beste Variante für mehrere String-Ersetzungen?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Moin !

WOW 8o
Danke für diesen ausführlichen Test samt Erklärungen !

Meine Variante entspricht ja dann deinem ReplaceArrayForInit.
Ist also nicht so langsam

Zitat
dass der Flaschenhals die Datenübertragung sein sollte, insbesondere wenn wir über RS232 reden.
Bei RS232 bin ich da voll bei euch. Und für den TCP Traffic wird es dann wohl auch hinreichend optimiert sein

Thema: (Schnellste) Beste Variante für mehrere String-Ersetzungen?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Die Lösung reicht mir auch erstmal.

Danke allen für die Infos und Ideen.

Thema: (Schnellste) Beste Variante für mehrere String-Ersetzungen?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Moin !

@herbivore:

Zitat
Aber vermutlich geht es überhaupt nicht um Geschwindigkeit
Das sehe ich etwas anders. Du hast schon Recht das im Moment kein Engpass vorliegt. Aber wie ich im ersten Post schon schrieb möchte ich auch die Daten die vom Netzwerk kommen in einem Logging festhalten. Und da können sehr schnell viele Daten kommen. Und dann könnte ich mir schon vorstellen das man an dieser Konvertierung etwas optimieren kann und sollte.

Ich habe mal deine Ideen in eine Funktion gegossen. Rausgekommen ist das hier:

        public string ReplaceSpecials(string input)
        {
            string[] change =
            {
                "<NUL>", "<SOH>", "<STX>", "<ETX>", "<EOT>", "<ENQ>", "<ACK>", "<BEL>", "<BS>", "<TAB>", "<LF>", "<VT>", "<FF>",
                "<CR>", "<SO>", "<SI>", "<DLE>", "<DC1>", "<DC2>", "<DC3>", "<DC4>", "<NAK>", "<SYN>", "<ETB>", "<CAN>", "<EM>",
                "<SUB>", "<Esc>", "<FS>", "<GS>", "<RS>", "<US>"
            };

            var sb = new StringBuilder(input.Length * 3);

            for (int i = 0; i < input.Length; i++)
            {
                if (input[i] > 31)
                {
                    sb.Append(input[i]);
                }
                else
                {
                    sb.Append(change[input[i]]);
                }
            }

            return sb.ToString();
        }

Was jetzt noch fehlt wäre die Verwendung eines Char Arrays. Das lass ich mal für eine weitere Optimierung offen

Thema: (Schnellste) Beste Variante für mehrere String-Ersetzungen?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Moin !

@m0rius:
Ich will ja die Sonderzeichen nicht raus filtern sondern durch was lesbares ersetzen. Insofern hilft dein Ansatz nur bedingt.

Thema: (Schnellste) Beste Variante für mehrere String-Ersetzungen?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Moin,

Zitat
Warum ignorierst du die Steuerzeichen nicht schon in deiner Empfangsroutine?
Weil ich die Daten gerne sehen und analysierenmöchte
Zitat
Stringbuilder Replace sollte da beim nachträglichen Replace am schnellsten gehen.
Danke. Dann werde ich das mal damit versuchen.

Thema: (Schnellste) Beste Variante für mehrere String-Ersetzungen?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Moin !

Ich möchte in einem Terminalprogramm das RS232 und TCP Daten empfängt gerne die empfangenen Daten u.a. als String darstellen. Das führt aber logischerweise zu Problemen sobald Steuerzeichen ins Spiel kommen (Zeichen 0-31).

Nun würde ich gerne bei eintreffenden Strings diese Zeichen ersetzen. z.B. "\r" in "<CR>" oder auch "0x0D". Was ist dafür die schnellste Variante? Spontan würde ich ja erstmal die normale Replace Methode verwenden. Bin mir aber nicht sicher ob das der sinnvollste und schnellste Weg ist. Ich müsste ja dann 32 Replaces an den String hängen ...

Hat evtl. jemand eine bessere (und evtl. auch schnellere) Variante zur Hand?

Thema: Farbverlauf: Aktuelle (Zwischen-)Farbe aus gegebenen Start- und Endfarbwert berechnen
Am im Forum: Grafik und Sound

Moin !

Zitat
Der Farbwert für die Position wäre ein einfacher 3satz wenn man mit dem HSV farbraum arbeitet
korrekt.

Ich werde das damit versuchen.

Danke für die Info.

Thema: Farbverlauf: Aktuelle (Zwischen-)Farbe aus gegebenen Start- und Endfarbwert berechnen
Am im Forum: Grafik und Sound

Moin !

Zitat
Nein er meint wohl ein Farbband
Genau.

Mit Min / Max / Value hat man ja eine position im Farbband.
Und die Frage war ob es eine einfache Möglichkeit gibt bei gegebener Start & Endfarbe den Farbwert für die Position zu bekommen.

Thema: Farbverlauf: Aktuelle (Zwischen-)Farbe aus gegebenen Start- und Endfarbwert berechnen
Am im Forum: Grafik und Sound

Moin !

Gibt es in C# eine elegante / schnelle Möglichkeit um eine Farbe zu berechnen bei gebenem Min / Max / Value als Double Werte?

Ich möchte damit in einem Chart eine Höhenlinie einfärben.

In .Net gibt es doch einige Klassen für Gradienten. Könnte man sowas evtl. missbrauchen um einen Farbwert zu ermitteln?

Bsp:
Max = 400, Min = 100, Value = 250
ColorMax = Red
ColorMin = Blue
Ergebnis : 50% Blau, 50% Rot als Color Wert (ergibt einen Lila Ton)

Das hier geht schon in die Richtung:
Calculating Color Values for Visualization (C#)

Aber evtl. geht das auch noch einfacher ?

Thema: Client Side HTML / Javascript debuggen mit VS?
Am im Forum: Web-Technologien

Moin !

Zitat
Visual Studio 2012 kann das zumindest mit IE 10.
Auch das hatte ich probiert - ohne Erfolg.
Muss man dabei noch was spezielles beachten?

Oder mal anders gefragt ... Wie ist denn die generelle Vorgehensweise dabei? Meine Hoffnung war ja ... Code schreiben, Breakpoint setzen, F5 drücken und wenn ich an die Breakpointstelle komme stoppt das JavaScript und ich lande in VS ...
Zitat
Aber vielleicht reichen die F12 Entwicklertools im Internet Explorer auch. Da kannst du auch Javascript mit debuggen.
Das geht. Allerdings hatte ich die Hoffnung alles in VS machen zu können. Denn mit VS.PHP habe ich auch einen netten PHP Debugger der in VS läuft. So hätte man eine zentrale Stelle um alle Projektteile zu debuggen.

Thema: Client Side HTML / Javascript debuggen mit VS?
Am im Forum: Web-Technologien

Moin !

Ich bin gerade dabei eine kleine erweiterung für unsere Anwendung zu erstellen. einmal einen PHP REST Webservice und eine einfache HTML / JavaScript Client Seite welche Daten vom Webservice abrufen und anzeigen soll. Soweit die Idee ...
Nun hatte ich eigentlich gehofft das VS 2012 in der Lage ist pures HTML + JavaScript zu debuggen. Aber ich kriege es nicht zum laufen. Breakpoints werden niemals erreicht.

Im IE (9) habe ich das Debugging für JavaScript aktiviert.

Ich habe mir dann gedacht das ich einfach eine leere ASP.NET Seite nehme und die nur mit nativen HTML Elementen befülle. Wenn ich dort JavaScript einfüge bekomme ich bei einem Breakpoint die Aussage: "The breakpoint will not currently be hit. No symbols have been loaded for this document."

Wenn ich eine normale statische HTML Seite im VS habe mit JavaScript werden die Breakpoints einfach ignoriert.

Kann ich mit VS 2012 überhaupt eine normale HTML Seite + JavaScript debuggen (also den JS Teil)? wenn ja was muss ich tun damit VS auch bei Breakpoints hält?