Problem mit XNA und SDK: Textnachricht von C#- an C++-Anwendung senden



  • Hallo 🙂

    Ich arbeite mit Visual Studio 2010 unter Windows 7. Jetzt erst einmal kurz was mein Projekt macht. Eine C# Applikation soll eine Textnachricht an eine C++ Applikation senden (Named Pipes) .

    Folgendes Situation:

    Ich habe eine Konsolen-Applikation (C#) erstellt, die die Nachricht an die C++ Applikation sendet ( Ich erzeuge dabei einen Thread in der Konsolen-Applikation). Die c++-Applikation wird als ein Prozess in der Konsolenapplikation gestartet.
    Das funktioniert auch recht gut.

    Wenn ich aber jetzt z.B. mit Hilfe des XNA Frameworks und dem Surface SDK den gleiche Code benutze und einen Thread erzeuge, dann wird die C++-Applikation solange blockiert bis ich die C#-Applikation beendet habe.

    Ich habe mir gedacht, dass das Problem an den vergebenen Zugrifftsrechten liegen könnte. Oder?

    Hat Jemand eine Idee was ich falsch mache?

    Grüße :p



  • 1. Bahnof??
    2. Banhof??
    3. Hab keinen Plan wie das geht
    4. Bin auch kein Experte
    5.1 Als Titel wäre wohl >>Problem mit XNA und SDK: Textnachricht von C#- an C++-Anwendung senden<< angemessener.
    5.2 Frage für Experten kann alles Mögliche sein.. Also bitte eddietiere den Thread, vielleicht kriegst du dann auch mehr Antworten

    LG - Darius



  • Ich würd jetzt nicht unbedingt als erstes auf irgendwelche Rechteprobleme tippen. Aber so pauschal kann man da nichts sagen, zeig etwas Code.

    Und ändere den Titel, solche Threads will normal echt kein Mensch lesen.



  • Editiere deinen Thread-Titel auf was vernünftiges, und du bekommst von mir eine Antwort, wo zumindest eine nicht ganz schlechte Chance besteht dass sie passt.



  • OK

    Hier ein paar Infos!

    Der folgende Code wird in einer Konsolenanwendung ausgeführt. Ich starte einen Prozess der C++ Applikation "Client.exe" Mit Hilfe eines Thread's erzeuge ich eine Named Pipe (Server). Dieser Code funktioniert auch recht gut! Der String kann von der C++ Applikation gelesen werden!

    Process myProcess = new Process();
    
     ServerPipe myNewPipe = new ServerPipe("my_pipe");
    
                ParameterizedThreadStart pts = new ParameterizedThreadStart(myNewPipe.methode);
    
                Thread thread = new Thread(pts);
    
                thread.Start();
    
                try
                {
                    myProcess.StartInfo.FileName = "Client";
                    myProcess.Start();
    
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
    
                //-------------------------------------
    
                System.Threading.Thread.Sleep(10000);
    
                string mystring = "TestString";
                myNewPipe.SetContent(mystring);
                myNewPipe.WriteOn();
                System.Threading.Thread.Sleep(10000);
    

    Das Gleiche in der Surface bzw. XNA Applikation. Nur hier wird die C++ Applikation so lang blockiert, bis die C# Applikation beendet wird.

    ServerPipe = new ServerPipe("my_pipe");
                consoleApplikation = new Process();
                myprocess = new Process();
    
                 ParameterizedThreadStart pts = new ParameterizedThreadStart(ServerPipe.methode);
    
                 ServerThread = new Thread(pts);
    
                 ServerThread.Start();
    
                myprocess.StartInfo.FileName = Client";
                myprocess.Start();
    

    Jetzt wird die C++ Applikation so lang blockiert bis ich die C# Applikation beende! D.h. die C++ Applikation liest den String nicht.Hier noch die Klasse "ServerPipe" der C# Applikation.

    class ServerPipe
            {
                private NamedPipeServerStream pipeServer;
                private string mystring;
                private ASCIIEncoding streamEncoding;
                private StreamWriter sw;
                private string data;
                private bool writeDATA,closePIPE;
    
                public ServerPipe(string test)
                {
                    this.mystring = test;
                    pipeServer = new NamedPipeServerStream(mystring, PipeDirection.Out);
                    sw = new StreamWriter(pipeServer);
                    writeDATA = false;
                    closePIPE = false;
    
                }
                ~ ServerPipe(){
    
                    pipeServer.Close();
                }
                public void SetContent(string newData)
                {
                    this.data = newData;
                }
                public void WriteOn()
                {
                    writeDATA = true;
                }
                public void ClosePipe()
                {
                    closePIPE = true;
                }
    
                public void methode(object myobject)
                {
    
                    {
                        Console.WriteLine("NamedPipeCreated");
                        pipeServer.WaitForConnection();
                        Console.WriteLine("Client connected");
                        while (true)
                        {
                            try
                            {
    
                                {
                                    if (writeDATA)
                                    {
                                        sw.AutoFlush = true;
    
                                        streamEncoding = new ASCIIEncoding();
                                        byte[] output = streamEncoding.GetBytes(mystring);
                                        sw.Write(data);
                                    }
                                    //writeDATA = false;
                                }
                            }
                            catch (IOException e)
                            {
                                Console.WriteLine("ERROR: {0}", e.Message);
                            }
    
                            if (closePIPE) break;
    
                        }
                        sw.Close();
                    }
    
                }
            }
    

    Hier der Code für die NamedPipe in der C++ Applikation

    temp = "Failed to connect to pipe";
    	temp2 = "Reading data from pipe...";
        numBytesRead = 0;
    
        pipe = CreateFile(
    		"\\\\.\\pipe\\my_pipe",
    		GENERIC_READ, // only need read access
    		FILE_SHARE_READ | FILE_SHARE_WRITE,
    		NULL,
    		OPEN_EXISTING,
    		FILE_ATTRIBUTE_NORMAL,
    		NULL
    	);
    

    Ich weiss jetzt echt nicht mehr weiter!
    Ich wäre über Hilfe sehr dankbar! 🤡



  • In deinem 2. Codeschnippsel wird weder ServerPipe.SetContent() noch ServerPipe.WriteOn() aufgerufen.

    (Mal ganz abgesehen davon dass dein Code furchtbar ist, nicht thread-safe etc.)


Anmelden zum Antworten