Programmierung » ClassPad 300 » Basic » Multi-Player
Multi-Player
(Tutorial)
In diesem Tutorial geht es darum einige grundlegende Dinge, die bei Programmen, die auf zwei ClassPads laufen und mit einander kommunizieren, zu erklären.
Protokoll
Als erstes sollte ein "Protokoll" vereinbart werden. Protokoll ist nicht ganz richtig, denn man schickt ja immer nur Zeichenketten (mit definiertem Inhalt) hin und her. Richtiger wäre etwas wie: Definition des Sprachumfanges, doch das würde den Rahmen einer Überschrift sprengen.
Genug der Worte, lasst uns beginnen. Wie das Protokoll im eizelnen aussieht kann ich nicht sagen, da es von
Fall zu Fall verschieden ist. Hier geht es auch nicht darum das was, sondern das wie zu vermitteln.
Eines, was das Protokoll aber haben sollte ist ein Wort für die Synchronität (angebracht ist "sync" oder "rdy")
Hand-Shake
Einen Hand-Shake auszuführen und am Anfang auszumachen, wer zuerst sendet, ist auf den ersten Blick eine gute Idee. Wenn man aber genauer darüber nachdenkt, kommt man zu dem Schluss, dass es doch nicht so gut ist. die Festlegung der Rollen klappt nur solange, wie der "Empfänger" (der ClassPad, der zuerst auf empfang geht) auch zuerst auf Empfang geht.
| ClassPad 1 | Komm. | ClassPad 2 |
OpenComPort38k 'Handshake 'sendet als 1. "sync" |
-> -> -> -> <- <- |
OpenComPort38k 'Hand-Shake 'sendet als 2. GetVar38k g "sync" |
Anders sieht das Ganze aber aus, wenn der Sender zuerst sendet und gleich darauf auf Empfang geht, dann stecken beide Programme im Empfang fest und warten auf den anderen, es kommt jedoch nichts:
| ClassPad 1 | Komm. | ClassPad 2 |
OpenComPort38k 'Handshake 'sendet als 1. "sync" |
->| <- <- -> <- -> . . . |
OpenComPort38k
'Hand-Shake
'sendet als 2.
GetVar38k g
'die Programme
'hängen fest
|
Das heißt aber nicht, das Hand-Shakes in den Programmen generell nicht sinnvoll sind (Nur das Tauschen von senden und empfangen ist nicht sinnvoll)!
Synchronität
Synchronität heißt beide Programme (auf beiden Rechnern) sind zum selben Zeitpunkt an der selben Stelle.
Dies ist besonders dann notwendig, wenn zum Beispiel beide (oder einer der) Nutzer Eingaben machen müssen und
es nach der Eingabe notwendig ist Daten - welcher Art auch immer - auszutauschen. Doch 100% Synchronität kann man
nie herstellen, denn der Code der dieses bewerkstelligen soll produziert selbst Insynchronität. Diese ist
aber bedeutend weniger gravierend wie ohne den Code.
Wenn es nicht erforderlich ist, zu wissen wo das Programm ist (oder ist durch den Aufbau des Programmes festgelegt
ist), reicht eine einfache Synchronisatition aus (Die grün markierten Bereiche sind nicht unbedingt notwendig,
verbessern aber das Verhalten):
| ClassPad 1 | Komm. | ClassPad 2 |
OpenComPort38k 'anderer Porgramm-Code 'ab hier insync "sync" |
->| <- <- <- -> -> -> -> -> |
OpenComPort38k 'anderer Porgramm-Code 'ab hier insync "sync" |
Wenn nun aber ein Programm mit seinem Partner Daten in einer Bestimmten Reihenfolge austauschen soll, dann reicht
dies nicht mehr aus. (Es also mehrere Stellen mit Synchronisierung gibt/geben soll.) Eine einfache Lösung des
Problems ist das Anhängen von Nummern an das Sync-Wort (z.B. "sync:1", "sync1", o.ä.).
Dann entsteht u.U. ein anderes Problem: Das Programm kann nicht nach einem Abbruch fortgesetzt werden, weil
dann das Programm, welches noch läuft, ein anderes Wort erwartet als das neu gestartete Programm liefert. In diesem
Fall gibt es zwei grundsätzliche Wege: Der Nutzer entscheidet, wie fortgesetzt wird (was nicht so gut ist - im
Schlimmsten Fall läuft nichts und der Nutzer probiert evtl.) oder man testet das Erhaltene auf die verwendeten
Sync-Wörter und springt dann zu der entsprechenden Stelle oder ruft das Entsprechende Programm auf:
"sync1"s SendVar38k s GetVar38k g StrCmp "sync1",g,t If t=0 Then SendVar38k s IfEnd StrCmp "sync2",g,t If t=0 Then SendVar38k s IfEnd StrCmp "sync3",g,t If t=0 Then SendVar38k s Else 'Komm-Fehler IfEnd Lbl A 'Code "sync2"
s SendVar38k s GetVar38k g StrCmp "sync1",g,t If t=0 Then "sync1"
s SendVar38k s Goto A IfEnd StrCmp "sync2",g,t If t=0 Then SendVar38k s Goto B IfEnd StrCmp "sync3",g,t If t=0 Then SendVar38k s Else 'Komm-Fehler IfEnd Lbl B 'Code "sync3"
s SendVar38k s GetVar38k g StrCmp "sync1",g,t If t=0 Then "sync1"
s SendVar38k s Goto A IfEnd StrCmp "sync2",g,t If t=0 Then "sync2"
s SendVar38k s Goto B IfEnd StrCmp "sync3",g,t If t=0 Then SendVar38k s Else 'Komm-Fehler IfEnd Lbl C 'Code
s