Seite 2 von 4

Verfasst: 03.08.2009 14:28
von Sven
>> Bisher sind diverse Abspielprogramme immer abgestürzt, wenn sie nicht einfach gemeldet haben, dass etwas nicht stimmt, um danach ihre Tätigkeit zu beenden.

Das Programm soll nebenher auch noch Diaprojektoren und anderen Kram steuern. Da kommt das nicht so gut.

>> Aber wozu den Videothread killen und neu starten, wenn die Datei doch sowieso reif für den Papierkorb ist? Wenn die Wiedergabe von vorne gestartet wird, wird alles wieder an derselben Stelle zu Grunde gehen.

Weil das Video nur ein Teil ist, danach geht es mit Bildern oder anderen Videos weiter.

Muss ich euch doch mal mit den Details behelligen: Ursächlich ist das Programm eine Steuersoftware für Geräte (Diaprojektoren und so) über RS232. Daneben - und nicht haupsächlich - soll es Audio- und Videodateien abspielen und Bilder einblenden können. Momentan nur auf einem Screen und aus dem Hauptprogramm heraus. Die Steuerung erfolgt anhand einer Liste, die abgearbeitet wird, sogenannte Timeline.

Jetzt soll das Programm erweitert werden, um auf mehreren Screens => mehreren Beamern ausgeben zu können. Also zwei Grakas, auf einer mit Monitor das Hauptprogramm mit Steueroberfläche. Auf der anderen zwei Ausgänge mit je einem Beamer zur Anzeige der Videos...

Eine Möglichkeit wäre noch, den WindowedScreen über beide Beamer zu ziehen und die Bildinhalte nebeneinander darzustellen. Aber aus Performance-Gründen wäre das die schlechteste Lösung.

>> wenn solltest du Sprite3D benutzen

Jo, hab schon. Es gibt die low-Hardware-Variante, wo nur Bilder und Videos angezeigt werden, mit Sprite und Video-Overlay, und es gibt die rechenintensive Variante, wo die GPU mit Sprite3D arbeitet und Überblenden, Zoomen und so Kram geht.

>> ganz so einfach ist es nicht, weil getrennte Prozesse nicht ohne weiteres auf Memory von anderen Prozessen zugreifen können

Also wieder API? Mist, und ich wollte mal von API wegkommen, um das auch portierbar zu haben.

Verfasst: 03.08.2009 14:35
von Sven
Was haltet ihr von der Idee, die Kommunikation statt über SharedMem über Network zu machen? Also Hauptprogramm als Server, Videoprogramme als Client auf einem Rechner.

Funktioniert das dann nur, wenn eine Netzwerkkarte installiert ist?

Ich hatte dazu vor längerer Zeit mal ein Beispiel gesehen, aber ich finds nicht mehr :-(

Verfasst: 03.08.2009 14:57
von Rokur
Ja das kannst du mit Netzwerk machen. Eine Netzwerkkarte brauchst du dazu nicht unbedingt, es muss halt das verwendete Protokoll (zu empfehlen wäre TCP) installiert, und ein Loop-Back eingerichtet sein. Dann kannst du über die IP-Adresse 127.0.0.1 kommunizieren (verschiedene Ports verwenden). Zum Test kannst du diese Adresse ja mal an pingen.

Ein einfaches Server-Beispiel befindet sich im Examples-Verzeichnis der PB-Installation (FTP- und Web-Server).

Verfasst: 03.08.2009 15:06
von Sven
Hab gerade die Beispiele mal ausprobiert, sieht gut aus. Die Zuordnung mach ich über die Ports, also Video 1 = Port 6832, Video 2 = Port 6833, oder?

Was mach ich, wenn ein anderes Programm den Port schon belegt, nächsten suchen?

Können zwei Programme gleichzeitig auf einen Port zugreifen, ohne groß rumzutricksen?

Sorry, Netzwerk war bis jetzt überhaupt nicht mein Ding.

Verfasst: 03.08.2009 15:08
von Vermilion
Also wieder API? Mist, und ich wollte mal von API wegkommen, um das auch portierbar zu haben.
Da kommst du mit PureBasic internen Befehlen nicht weit. Wenn, musst du mit Betriebssystemabhängigen Includes oder derartigem arbeiten. OS-spezifische APIs verwenden.
Was mach ich, wenn ein anderes Programm den Port schon belegt, nächsten suchen?
Ja.

Verfasst: 03.08.2009 15:27
von Sven
Sollte ich für die Ports den Bereich 49152 bis 65535 (Dynamic und/oder Private Ports) nehmen oder kann ich einen beliebigen in der IANA-Liste als unassigned beschriebenen Bereich verwenden?

Verfasst: 03.08.2009 17:18
von cxAlex
Dafür brauchst du keine Netzwerk-Befehle. Die sind nicht dazu gemacht lokal rumzukommunizieren, totaler Overkill. Auch wird die eine oder andere Firewall schreien wenn sich da einfach mal so ein Server öffnet, was man als eingeschränkter User nicht immer abstellen kann. Verwende entweder Shared Memory, Named Pipes oder Mailslots. Schmeiß mal die SuFu an und such einen der 3 Begriffe und dir wird schnell geholfen sein...

Gruß, Alex

Verfasst: 03.08.2009 20:19
von Sven
Ich möchte aber keine API, wegen Portierbarkeit.

Netzwerk hätte den Vorteil, dass ich mit wenig Aufwand auch Steuersoftware und Videoclient auf zwei verschiedenen Rechnern laufen lassen könnte, wenn das mal jemand will.

Verfasst: 03.08.2009 20:23
von Kaeru Gaman
"Portierbarkeit" wird bei so einem komplexen Problem sowieso nicht damit getan sein,
den selben Code ohne API zu schreiben und ihn einfach durch alle Compiler zu jagen.

ein sehr großer Arbeitsaufwand wird nötig sein, um die Routinen so anzupassen,
dass sie auf allen Systemen wirklich die gleiche Funktionalität zeigen.

ein paar Unterroutinen zu schreiben, die die jeweiligen API Funktionen Wrappen,
wird dagegen ein Sonntagsspaziergang werden.

vergiß erst mal die Portierbarkeit, die wird dir nochmal ein riesiges Extra-Problem werden,
wenn du mit der jetzigen Aufgabenstellung durch bist.

Verfasst: 03.08.2009 20:33
von Sven
Davon gehe ich aus, aber ich muss es mir ja nicht schwerer machen als nötig. Darum gehts aber jetzt nicht.

Kann sein, dass das mit den Netzwerkfunktionen Overkill ist, aber bis auf das Argument Firewall find ich das nicht schlimm. Da das bei ausgewählten Projekten läuft, hab ich da zum Einrichten eh Admin-Rechte und kann das der Firewall beibringen.