tutorials.de Buch-Aktion 02/2012
ERLEDIGT
NEIN
ANTWORTEN
4
ZUGRIFFE
448
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    mdo mdo ist offline Mitglied Bronze
    Registriert seit
    Feb 2010
    Beiträge
    37
    Hallo!
    Ich habe ein kleines Problem und eine Lösung, welche wohl ein Overkill darstellen würde...

    Problem:
    Ich habe eine Art Winamp programmiert und als Standardprogramm für *.wav Dateien eingetragen. Klicke ich nun also auf eine *.wav Datei, so öffnet sich mein Player und spielt sie ab. Klicke ich nun aber auf eine Weitere *.wav Datei, so öffnet sich eine neue Instanz des Players... Da dies nicht der gewünschte Effekt ist, brauche ich Hilfe



    Gewünschter Effekt:
    Die neu angeklickte Datei soll der Playlist angehängt werden.
    Bsp:

    MeineWave1.wav
    MeineWave2.wav

    1. Doppelklick auf MeineWave1.wav
    2. Player1 öffnet sich mit MeineWave1.wav in der Playlist
    3. Doppelklick auf MeineWave2.wav
    4. Player1 added MeineWave2.wav zu der Playlist



    Meine grundsätzlich funktionierende aber viel zu komplzierte Lösung:
    Jeder Player lauscht auf einem Port auf localhost. Sobald ein Player gestartet wird, sendet dieser eine Statusabfrage mit einer (seiner) UniqueID über den Port. Der ältere Player empfängt diese Nachricht, erkennt dass es nicht seine ID ist und sendet dem neuen Player ein Statusflag und seine ID. Daraufhin gibt der neue Player die Datei (welche in den args steht) und einen AUfruf zum adden in die Playlist an den alten player weiter...
    Bsp:

    MeineWave1.wav
    MeineWave2.wav

    1. Doppelklick auf MeineWave1.wav
    2. Player1 startet und beginnt den Port 666 abzuhören und sendet einmal auf dem Port 666 das Segment: #STATUS#Player1#
    3. Player1 bekommt innerhalb des kurzen Timeouts (500ms) keine Antwort und geht davon aus, dass er alleine ist...
    4. Player1 öffnet sich mit MeineWave1.wav in der Playlist
    5. Doppelklick auf MeineWave2.wav
    6. Player2 startet und beginnt den Port 666 abzuhören und sendet einmal auf dem Port 666 das Segment: #STATUS#Player2#
    7. Player1 empfängt das Segment von Player2 und erkennt, dass es sich nicht um seine ID handelt.
    8. Player1 sendet auf Port 666 das Segment: #ACK#Player1#
    9. Player2 empfängt das ACK Segment mit der ID des lebenden Players und sendet zurück: #ADD_TO_PLAYLIST#C:\MeineWave2.wav#
    10. Player2 beendet sich
    11. Player1 added MeineWave2.wav zu der Playlist


    Diese Vorgehensweise ist zu kompliziert und zu fehleranfällig... Hat jemand da eine bessere Idee?

    EDIT:
    Habe dazu ein nettes Snippet gefunden:

    bool createdNew;

    System.Threading.Mutex mutex = new System.Threading.Mutex(true, Application.ProductName, out createdNew);
    if (createdNew) {
    // bitte Form1 ersetzen
    Application.Run(new Form1());
    // und auch wieder Freigeben besser ist besser
    mutex.ReleaseMutex();
    } else {
    MessageBox.Show("Programm wurde bereits gestartet!", "Info", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }

    Allerdings ist hier die Weitergabe von MeineWave2.wav an die Playlist von Player1 nicht realisiert... Also müsste ich auch hier ein Gespräch der beiden Player über Ports realisieren...
    Übrigens: Zielframework ist .NET 2.0!
    Geändert von mdo (09.03.10 um 16:46 Uhr)
     

  2. #2
    Avatar von colblake
    colblake colblake ist offline Mitglied Gold
    Registriert seit
    Jan 2004
    Ort
    dresden
    Beiträge
    214
    Hallo mdo,

    <nur sone Idee>

    Du könntest dafür Named Pipes benutzen:
    Wenn die Pipe nicht vorhanden ist, dann ist noch kein Programm von Dir gestartet -> Programm starten.
    Wenn eine named Pipe vorhanden ist, dann schicke den Dateinamen der wav über die pipe zu dem "alten Programm".

    </nur sone Idee>

    Gruß
    Col.Blake
     
    Über so viele Sachen wächst Gras , man kann keiner Wiese mehr trauen.

  3. #3
    mdo mdo ist offline Mitglied Bronze
    Registriert seit
    Feb 2010
    Beiträge
    37
    Hallo colblake!

    Ja, über named pipes habe ich auch schon nachgedacht, allerdings gibts da ein Problem und eine Unbekannte:

    Problem:
    Das Zielframework ist .NET 2.0. Also kein .NET Support für named Pipes... Daher müsste ich über dllImport alte Win32 API calls benutzen... Prinzipiell kein Thema, aber "unschön"... Gibts da keine bessere Alternatvie? Kann mir nicht vorstellen, dass .NET 2.0 derart arm in IPC DIngen bestückt ist...
    Auf der anderen Seite habe ich selbst auch noch nichts weiter gefunden

    Unbekannte:
    Der Recorder soll citrixfähig sein... Ich weiß nicht, in wie fern dies mit den named Pipes zusammenspielt... Die laufen ja quasi alle auf der gleichen Maschine und doch in unterschiedlichen Sessions... Kommen die sich sessionübergreifend nicht in die Quere?
     

  4. #4
    Avatar von colblake
    colblake colblake ist offline Mitglied Gold
    Registriert seit
    Jan 2004
    Ort
    dresden
    Beiträge
    214
    Hi mdo,

    Zitat Zitat von mdo Beitrag anzeigen
    Problem:
    Das Zielframework ist .NET 2.0. Also kein .NET Support für named Pipes... Daher müsste ich über dllImport alte Win32 API calls benutzen... Prinzipiell kein Thema, aber "unschön"... Gibts da keine bessere Alternatvie? Kann mir nicht vorstellen, dass .NET 2.0 derart arm in IPC DIngen bestückt ist...
    Auf der anderen Seite habe ich selbst auch noch nichts weiter gefunden
    Nun, ich habe das auch noch nicht mit .NET gemacht. Daher wusste ich nicht, dass es das im 2.0er nicht gibt. Man lernt nie aus.

    Zitat Zitat von mdo Beitrag anzeigen
    Unbekannte:
    Der Recorder soll citrixfähig sein... Ich weiß nicht, in wie fern dies mit den named Pipes zusammenspielt... Die laufen ja quasi alle auf der gleichen Maschine und doch in unterschiedlichen Sessions... Kommen die sich sessionübergreifend nicht in die Quere?
    Da kann ich leider nix zu sagen. Von Citrix habe ich keinen Plan. Aber hast Du dann mit Deinem komplizierten Ansatz nich das gleiche Problem?

    Gruß
    Col.Blake
     
    Über so viele Sachen wächst Gras , man kann keiner Wiese mehr trauen.

  5. #5
    mdo mdo ist offline Mitglied Bronze
    Registriert seit
    Feb 2010
    Beiträge
    37
    Stimmt natürlich...
    Die Kommunikation über Ports hat genau die gleichen Probleme wie die Kommunikation über named Pipes. In jedem Fall brauch jede Instanz des Recorders/Players eine Unique ID welche übermittelt werden muss (bzw bei den Pipes wäre es der Name der Pipe). Von daher hast du recht...
    Ich mach mir die Tage mal ausführlich Gedanken über die beiden Alternativen. Allerdings wäre ich für weitere Vorschläge dankbar, denn gefallen tun mir beide Varianten nicht sonderlich... Aber wenns sonst nix gibt, bleibt mir wohl keine andere Wahl...
    Das schicke an der Portkommunikation ist, dass man so PC übergreifend die Player Kommunizieren lassen kann... Das schicke an named Pipes ist die Einbettung in Windows (nicht so fehleranfällig). Hm, schwere Entscheidung...
     

Ähnliche Themen

  1. Antworten: 1
    Letzter Beitrag: 07.01.11, 20:42
  2. Putty --> auf eine laufende Konsole wechseln
    Von Timo Rickert im Forum Linux & Unix
    Antworten: 1
    Letzter Beitrag: 25.10.05, 13:09
  3. Antworten: 3
    Letzter Beitrag: 24.10.05, 10:53
  4. per sql eine laufende Nummer bilden
    Von hgdlin im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 17.03.05, 14:37
  5. Laufende Instanz fernsteuern
    Von OliWan im Forum .NET Archiv
    Antworten: 6
    Letzter Beitrag: 13.10.04, 17:20