Lower Posted August 16, 2005 Share Posted August 16, 2005 Wenn ich mithilfe der Funktion "Videotext.Getpage(100,0)" des Com-Interface der neuen DVBViewer Version 3.2.1 die Daten aus dem Teletext Seite 100 abfrage, wird dort nicht die aktuelle Uhrzeit angezigt. Bsp: Wenn ich jede Sekunde die Daten aus dem Teletext (Seite egal) abrufe, müsste bei jeder Abfrage eine andere Uhrzeit vorkommen (1 Sekunde später). Das ist aber nicht der Fall. Die Uhrzeit bleibt "stehen". Manchmal wird erst nach etwa 10 Sekunden die aktuelle Zeit angezeigt. Ausnahme: Wenn ich nun allerdings vom DVBViewer das Teletextfenster öffne und offen lasse und dann den Teletext abfrage, wird die richtige Uhrzeit angezeigt (ändert sich jede Sekunde). Woran liegt das? Ist das ein Fehler des COM-Interface oder des DVB-Viewers oder ...? Gruß Lower Quote Link to comment
Guest Lars_MQ Posted August 16, 2005 Share Posted August 16, 2005 Hmm, hab ich noch nie probiert. Die daten werden direkt aus dem seitenpuffer des DVBViewer entnommen. Da der gesamte videotextkram eh grade umgestellt wurde auf grigas neue klasse, hat sich auch der bereich geändert (nur intern). Ich werde mal testen ob das immer noch so ist. Quote Link to comment
Griga Posted August 16, 2005 Share Posted August 16, 2005 Die Ursache ist, dass Teletextseiten nicht im Sekundenrythmus upgedatet werden. Bei manchen eher unwichtigen kann es länger als eine Minute dauern. Die laufende Uhrzeit im Teletext-Fenster ist "getrickst". Und zwar wird von *jeder* empfangenen Seite die Kopfzeile in einem separaten Puffer gespeichert. Die rechte Hälfte der *originalen* Kopfzeile der dargestellten Seite überschreibt der DVBViewer dann im Sekundenrhythmus durch die rechte Hälfte der *zuletzt empfangenen* Kopfzeile. Was das COM-Interface liefert, ist dagegen die unverfälschte Seite. An der Uhrzeit kann man sehen, wann sie zuletzt upgedatet wurde. Allerdings ließe sich der gleichen Trick mit etwas Bastelei auch hier anwenden. Quote Link to comment
Guest Lars_MQ Posted August 16, 2005 Share Posted August 16, 2005 Wobei ich den sinn einer synthetischen zeit dort bezweifle, da es die computer und nicht die "teletextzeit" widerspiegelt. Ich bin da offen, wird das benötigt? dann füge ich das ein. Quote Link to comment
Griga Posted August 16, 2005 Share Posted August 16, 2005 Wobei ich den sinn einer synthetischen zeit dort bezweifle Ebenfalls. Die Uhrzeit ist durch die Teletext-Spezifikationen nicht zwingend vorgeschrieben. Das Format und die genaue Position ist je nach Sender verschieden (insbesondere bei ausländischen Kanälen), manche blenden an der Stelle zeitweise Laufschrift oder sonstwas ein... Ich habe mich auch schon gefragt, ob das im DVBViewer sein muss. Das sekündliche Neu-Rendern der Teletext-Seite verbrät nämlich einiges an Rechenzeit (gibt schöne Zacken in der Taskmanager-Prozessorlast-Kurve). Allerdings sind es viele Anwender vom Fernseher und dessen Hardware-Teletextdecoder gewohnt, dass die Uhr läuft, und wenn sie es beim DVBViewer nicht tut, wird dies - wie sollte es auch anders sein - als "Bug" bemängelt. Was für das Plugin- oder COM-Interface eher Sinn machen würde, wäre eine Art Callback, der aufgerufen wird, sobald eine bestimmte Seite (oder meinetwegen irgendeine Seite) neu eingetroffen ist - gerade Lowers Anwendung könnte dann noch präziser und ohne ständiges Polling arbeiten. Allerdings müsste dieser Callback sauber von dem Thread entkoppelt werden, der die Teletext-Daten anliefert, weil es der gleiche Thread ist, der alle DVB-Daten (also auch Video & Audio) verteilt. Sonst könnte ein Fehler in einem COM-Client den ganzen DVBViewer zum Absturz bringen, und zwar heftigst. Ich würde deshalb intern ein PostMessage zwischenschalten. Quote Link to comment
Guest Lars_MQ Posted August 17, 2005 Share Posted August 17, 2005 Allerdings müsste dieser Callback sauber von dem Thread entkoppelt werden, der die Teletext-Daten anliefert, weil es der gleiche Thread ist, der alle DVB-Daten (also auch Video & Audio) verteilt. Sonst könnte ein Fehler in einem COM-Client den ganzen DVBViewer zum Absturz bringen, und zwar heftigst. Ich würde deshalb intern ein PostMessage zwischenschalten. Das war genau der grund, warum ich die Events aus dem COM wieder rausgenommen hatte. Ein Absturz wäre zwar auch denkbar, aber der gesamte thread würde für die verarbeitungszeit angehalten und das wäre genauso fatal... Ein ständiges Callback würde das system sicherlich auch unnötig belasten, daher müsste man dort wohl mit registrierung für einzelne Seiten arbeiten. Oh, ich sehe schon, dort sind noch so einige Möglichkeiten Quote Link to comment
Lower Posted August 17, 2005 Author Share Posted August 17, 2005 Was für das Plugin- oder COM-Interface eher Sinn machen würde, wäre eine Art Callback, der aufgerufen wird, sobald eine bestimmte Seite (oder meinetwegen irgendeine Seite) neu eingetroffen ist - gerade Lowers Anwendung könnte dann noch präziser und ohne ständiges Polling arbeiten. Allerdings müsste dieser Callback sauber von dem Thread entkoppelt werden, der die Teletext-Daten anliefert, weil es der gleiche Thread ist, der alle DVB-Daten (also auch Video & Audio) verteilt. Sonst könnte ein Fehler in einem COM-Client den ganzen DVBViewer zum Absturz bringen, und zwar heftigst. Ich würde deshalb intern ein PostMessage zwischenschalten. Wäre optimal, wenn mein Programm benachrichtigt werden würde, sobald sich der Teletext Seite X geändert hat. Ich müsste nicht jede Sekunde oder noch schneller den Teletext öffnen und überprüfen, ob ein neues Lied angefangen hat. Allerdings weis ich nicht, wie man mit der SendMessage beim Empfang umgeht. D.h. ich weis nicht, wie ich abrufen kann, ob eine Message für mich angekommen ist oder nicht, und was diese beinhaltet. Müsste ich da wieder auf eine API zurückgreifen - was für eine API? Gruß Lower Quote Link to comment
Guest Lars_MQ Posted August 17, 2005 Share Posted August 17, 2005 Allerdings weis ich nicht, wie man mit der SendMessage beim Empfang umgeht.D.h. ich weis nicht, wie ich abrufen kann, ob eine Message für mich angekommen ist oder nicht, und was diese beinhaltet. Müsste ich da wieder auf eine API zurückgreifen - was für eine API? Also wenn ich das einbaue, würde das komplett über COM passieren. Du würdest dann mit "with events" arbeiten. Das mit dem Postmessage ist für das DVBViewer interne handling Quote Link to comment
Griga Posted August 17, 2005 Share Posted August 17, 2005 Ein ständiges Callback würde das system sicherlich auch unnötig belasten Nicht unbedingt. Die Datenrate bei Teletext liegt ungefähr im Bereich von Audio. Sagen wir mal über den Daumen gepeilt 240 kbit/s = 40 KB/s. Jede Seite ist 1 KB groß, macht 40 Callbacks pro Sekunde. Die Größenordnung wäre noch zu verkraften. Eine flexible Lösung, die unnötigen Callback-Overhead vermeidet, könnte darin bestehen, dass der Client einen Seitenbereich für den Callback angibt: Von...bis. Ein Programm, das Programminformationen oder Teletext-Börsenkurse auswertet, wäre darüber sicher glücklich. Quote Link to comment
Lower Posted September 18, 2005 Author Share Posted September 18, 2005 @ Lars_MQ: Ich habe mir soeben die neue DVBViewer Version heruntergeladen als auch die neue Com-Interface Beschreibung. Mir ist aufgefallen, dass wenn ich den Teletext abrufe erhalte ich nun die aktuelle auf die Sekunde genaue Uhrzeit. In der alten Version des DVBViewer konnte ich nur die um paar Sekunden verzögerte Uhrzeit abrufen. Wie haste du das nun in COM-Interface abgeändert? Ist die dort nun angezeige Uhrzeit nun sehr genau (auf die 1/10 Sekunde)? Ich brauche nämlich für den DVB-MR eine sehr genaue Teletextuhrzeit. Konntest du eigentlich die Benachrichtigung bei Teletextaktuallisierung durch das 'WithEvent' realisieren? Gruß Lower Quote Link to comment
Guest Lars_MQ Posted September 18, 2005 Share Posted September 18, 2005 Ich habe dort nichts geändert. Allerdings wurde die interne Teletextengine umgestellt auf die neue engine von Griga. Ich vermute, das hängt damit zusammen. (Ich glaube die zeit wird synthetisch generiert, aber sicher bin ich nicht). Die Eventunterstützung wird für die nächste grössere version kommen, dafür muss ich einiges ergänzen und testen vorher. Quote Link to comment
Griga Posted September 18, 2005 Share Posted September 18, 2005 Ich glaube die zeit wird synthetisch generiert Nicht ganz. Beim Ermitteln der zu einer Nummer gehörenden Teletext-Seite mit function TTeleParser.FindPage(PageNr,SubNr: Integer; var Page: TPageClass): Boolean; wird deren Header-Zeile teilweise ausgetauscht (exakt die zweite Hälfte ab Spaltenposition 20), und zwar gegen die Headerzeile der zuletzt vom Sender empfangenen Seite (mit beliebiger Nummer). Die Präzision hängt also vom Rhythmus ab, in dem Teletextseiten gesendet werden, und davon, wie der Sender das Einfügen der Uhrzeit in die Kopfzeile handhabt. Man kann nicht davon ausgehen, dass die Zeit bei verschiedenen Sendern immer im gleichen Format an der gleichen Stelle auftaucht. Ich habe es schon erlebt, dass anstelle der Uhr zeitweise Werbe-Laufschrift erschien. Also eine wackelige Angelegenheit. Quote Link to comment
Lower Posted September 18, 2005 Author Share Posted September 18, 2005 Lasst sich eigenlich irgendwie ermitteln in was für einem Abstand eine bestimmte Teletextseite gesendet wird? Lower Quote Link to comment
Griga Posted September 18, 2005 Share Posted September 18, 2005 Mit der alten Version ja, durch Vergleich der Uhrzeit in der Kopfzeile, sobald sie sich geändert hat. Mit der neuen nicht. Da musst du auf den Event-Mechanismus warten. Aber gerade bei Seiten, die "just in time" außerhalb der normalen Reihenfolge gesendet werden, wie z.B. Untertitelseiten, kann der Abstand sehr unregelmäßig sein. Quote Link to comment
Lower Posted September 18, 2005 Author Share Posted September 18, 2005 @ Griga: Dann muss ich wohl wieder jede Sekunde oder noch schneller den Teletext abfragen. Belastet aber zum Glück die heutigen PC's nicht besonders. Wäre toll, wenn der 'Event'-Mechanismus in der nächst größeren DVBViewer Version mit eingebaut würde. Freue mich schon auf diese Funktion. Gruß Lower Quote Link to comment
Guest Lars_MQ Posted October 23, 2005 Share Posted October 23, 2005 Um das alte thema wieder aufzuwärmen: ich habe jetzt angefangen die events zu integrieren. es gibt für teletext ein event, das aufgerufen wird bei eintrag einer neuen seite in den teletext seiten buffer. Das event meldet die Page und die Subpage. Ich habe das mal mit Word und VB probiert, innerhalb von 5 minutenhatte ich über 400 A4 seiten voller teletext Gut das system leidet etwas, aber die grösste last lag bei dem word teil, also wenn man die seiten gleich filtert, sollte das nicht so schlimm werden... Jetzt überlege ich was man noch für events braucht... OnChannelchange habe ich schon Quote Link to comment
Klausing Posted October 23, 2005 Share Posted October 23, 2005 Ich habe das mal mit Word und VB probiert, innerhalb von 5 minutenhatte ich über 400 A4 seiten voller teletextWürdest Du das einem Nichtprogrammierer vielleicht als Schritt für Schritt-Anleitung mal erklären wie das geht? Ich würde so etwas gern in die FAQ aufnehmen, hab aber absolut keinen Plan davon. Quote Link to comment
Guest Lars_MQ Posted October 23, 2005 Share Posted October 23, 2005 Wenn das ganze fertig ist, baue ich das in die COM-Doku mit ein und werde versuchen für jede Funktion ein Worddokument mit integriertem VB-Code als Demo zur verfügung zu stellen (die nutze ich ja auch zum testen ). Ob das nun anwendungen sind, die in ein allgemeinen Faq passen, wage ich zu bezweifeln, aber wir können ja eine kleine ecke mit kochrezepten für programmierungen mit dem COM kram einrichten Dort könnten wir auch alle comscripte die hier veröffentlicht wurden sammeln, wenn deren autoren zustimmen Da haben wir das wenigstens mal zentral. Quote Link to comment
Lower Posted October 24, 2005 Author Share Posted October 24, 2005 Um das alte thema wieder aufzuwärmen:ich habe jetzt angefangen die events zu integrieren. es gibt für teletext ein event, das aufgerufen wird bei eintrag einer neuen seite in den teletext seiten buffer. Das event meldet die Page und die Subpage. Ich habe das mal mit Word und VB probiert, innerhalb von 5 minutenhatte ich über 400 A4 seiten voller teletext Gut das system leidet etwas, aber die grösste last lag bei dem word teil, also wenn man die seiten gleich filtert, sollte das nicht so schlimm werden... Jetzt überlege ich was man noch für events braucht... OnChannelchange habe ich schon <{POST_SNAPBACK}> @ Lars_MQ Das ist ja suuuuper!! Hab die neue Version des DVB-MR fast fertig - habe dort den Teletext eben zwischen 1 und 10 mal in der Sekunde abgefragt. Das würde nun wegfallen. Ich müsste also nur auf des Event warten. Das ist schonmal viel angenehmer. Wann würde dann ungefähr der DVBViewer mit neuem COM-Interface herauskommen? Oder lässt sich das COM-Interface auch schon in die jetzige DVBViewer Version intigrieren (nachrüsten)? Wäre super wenn ich nächste Woche das neue COM-Interface zur Verfügung hätte. Dann könnte ich den DVB-MR nämlich in den Herbstferien umbauen bzw. vielleicht schon fertig stellen. Ein Event, das beim Staten oder Beenden des DVBViewer ausgelöst wird wäre vielleicht auch noch nützlich. Sonst fäll mir auf die Schnelle kein weiteres Event ein. Mfg. Florian Quote Link to comment
Guest Lars_MQ Posted October 24, 2005 Share Posted October 24, 2005 Wäre super wenn ich nächste Woche das neue COM-Interface zur Verfügung hätte. Dann könnte ich den DVB-MR nämlich in den Herbstferien umbauen bzw. vielleicht schon fertig stellen. Na da werden wir mal mit Christian reden, ob man da nicht was regeln kann. Ein Event, das beim Staten oder Beenden des DVBViewer ausgelöst wird wäre vielleicht auch noch nützlich. Sonst fäll mir auf die Schnelle kein weiteres Event ein. Also ein Close event habe ich. Ein start event ist etwas schwierig, weil, um an das event zu kommen, brauchst du das DVBViewer interface und das kriegste nur, wenn der DVBViewer schon gestartet ist... Diese events hab ich schon (plus das onTeletext event) function OnChannelChange(ChannelNr: Integer): function onRDS(RDS: WideString): HResult function onOSDWindow(WindowID: Integer): HResult function onDVBVClose: HResult function onStartRecord(ID: Integer): HResult function onEndRecord: HResult function onPlaybackstart: HResult function OnPlaybackEnd: HResult function OnPlaystatechange(State: Integer): HResult Quote Link to comment
Lower Posted October 24, 2005 Author Share Posted October 24, 2005 Na da werden wir mal mit Christian reden, ob man da nicht was regeln kann. Das wäre einfach toll, wenn sich da so schnell was machen würde. Also ein Close event habe ich. Ein start event ist etwas schwierig, weil, um an das event zu kommen, brauchst du das DVBViewer interface und das kriegste nur, wenn der DVBViewer schon gestartet ist... Das Starten-Event würde dann also nur verzögert gesendet werden - sobald das COM-Interface vom DVBViewer "eingerichtet" würde. Diese events hab ich schon (plus das onTeletext event) function OnChannelChange(ChannelNr: Integer): function onRDS(RDS: WideString): HResult function onOSDWindow(WindowID: Integer): HResult function onDVBVClose: HResult function onStartRecord(ID: Integer): HResult function onEndRecord: HResult function onPlaybackstart: HResult function OnPlaybackEnd: HResult function OnPlaystatechange(State: Integer): HResult <{POST_SNAPBACK}> Das sind ja schon richtig viele. Das RDS-Event könnte bei der Musikaufnahme von Radio auch sehr hilfreich sein - baue ich aber vorerst noch nicht in den DVB-MR ein. Mfg. Florian Quote Link to comment
Lower Posted October 27, 2005 Author Share Posted October 27, 2005 Ich habe das mal mit Word und VB probiert, innerhalb von 5 minutenhatte ich über 400 A4 seiten voller teletext Die neue DVBViewer Pro EXE mit dem neuen COM-Interface ist ja schon seit gestern auf dem FTP. Das ging ja schnell. Ich habe auch gleich gestern die neue EXE gedownloadet und versucht die Events zu nutzen (in VB.Net und in VB 6.0), doch komsischweise hat es in keiner Programmiersprache funktioniert. Entweder ich habe irgend etwas Grundlegendes vergessen, oder die Events des COM-Interface funktionieren bei mir nicht - was ich eigentlich nicht glaube. Kannst du mir mal die Source von deinem VB-Testprogramm, in dem du ein Event genutzt hast zur Verfügung stellen, damit ich weis was ich falsch gemacht habe? Gruß Florian Quote Link to comment
Guest Lars_MQ Posted October 27, 2005 Share Posted October 27, 2005 Das beispiel ist aus Word, sollte sich aber problemlos anpassen lassen. Eine klasse: Klasse1 Public WithEvents FVideotext As DVBViewerServer.Teletextmanager Public WithEvents FDVBEvents As DVBViewerServer.DVBViewerEvents Private Sub FDVBEvents_OnChannelChange(ByVal ChannelNr As Long) If Not FDVBEvents Is Nothing Then Selection.InsertAfter ChannelNr End If End Sub Private Sub FVideotext_onDataArrive(ByVal PageNr As Long, ByVal SubPageNr As Long) If Not FVideotext Is Nothing Then Selection.InsertAfter FVideotext.GetPage(PageNr, SubPageNr) End If End Sub im hauptcode: Dim DVBViewer As IDVBViewer Dim MyEvents As New Klasse1 Private Sub HookItUp() Set DVBViewer = GetObject(, "DVBViewerServer.DVBViewer") Set MyEvents.FVideotext = DVBViewer.Videotext Set MyEvents.FDVBEvents = DVBViewer.Events End Sub Zu beachten ist: - DVBViewerServer.DVBViewerEvents implementiert nur die Events, keiner methoden oder properties. - DVBViewerServer.Teletextmanager implementiert das event und zur bequemlichkeit auch gleich das IVideotext Interface. Beide Objekte müssen über das IDVBViewer Interface bezogen werden. gruss Lars Quote Link to comment
Lower Posted October 27, 2005 Author Share Posted October 27, 2005 @ Lars_MQ: Der Code hat mir sehr geholfen. Jetzt funktionieren die Events bei mir in VB.Net sowohl als auch in VB 6.0. Ich hatte einen kleinen Denkfehler ("Set" vergessen). Das neue COM-Interface ist einfach super! Ich werde gleich mal alle Events ausprobieren. Mfg. Florian Quote Link to comment
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.