Welcome, Guest
Username: Password: Remember me
Hier wird Deutsch gesprochen
  • Page:
  • 1
  • 2

TOPIC:

SerialLib Klasse für VO 2.8 23 Jun 2022 12:09 #22833

  • ArneOrtlinghaus
  • ArneOrtlinghaus's Avatar


  • Posts: 337
  • Ach so, das sind die Sockets. Da kann ich gar nicht groß mitreden.

    Wie viel es kostet, eine ältere Entwicklungsumgebung mitzuschleppen, muss man sich ausrechnen. Aber oft ist es gar nicht so schlimm, jedenfalls für ein paar Jahre. Mit den virtuellen Maschinen kann man solche Speziallösungen auch relativ preiswert auslagern auf eine virtuelle Maschine, die man nur startet, wenn man Änderungen machen muss.

    Ich hatte mehrere Jahre noch ein VO 2.5 parallel zu VO 2.8 installiert, weil ein automatisches Update für ein Hilfsprogramm nicht funktioniert hätte wegen den Runtime-Dlls cavort... -> vorun...
    Erst als die alte virtualisierte Entwicklungsumgebung mit Windows Vista nicht mehr funktionierte, hatte ich mich um Ersatz gekümmert, der auch mehr als 1 Tag Arbeit und Hilfe von Kollegen benötigt. Das sind natürlich "technische Schulden", die irgendwann abgearbeitet werden müssen.

    Gruß
    Arne

    Please Log in or Create an account to join the conversation.

    SerialLib Klasse für VO 2.8 23 Jun 2022 13:45 #22836

    • g.bunzel@domonet.de's Avatar


  • Posts: 83
  • Hallo Franz,

    ...wenn Du dazu Testanwendungen mitsenden würdest (Deinen EchoSrv und die Testanwendung zum Senden der Nachrichten) wäre es viel einfacher, bei dem Problem zu helfen. So müsste erst eine Testumgebung erstellt werden - die dann evtl. von Deiner Anwendung abweicht.

    Gruss

    Gerhard

    Please Log in or Create an account to join the conversation.

    SerialLib Klasse für VO 2.8 23 Jun 2022 14:10 #22837

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 310
  • Hallo Gerhard,
    der EchoSrv ist 1:1 derjenige, der bei VO dabei ist. Meine App kann ich nicht posten, da sind zu viele Umgebungsbedingungen vorhanden, die woanders nicht laufen würden (Oracle DB, 2 Waagen, 2 Magnetkartenleser, ..). Eine Reduktion auf das Wesentliche umfaßt den geposteten Teil, werd ich aber gerne in eine MDI oder SDI Basisapp einbauen, dauert ein wenig.

    Please Log in or Create an account to join the conversation.

    SerialLib Klasse für VO 2.8 23 Jun 2022 14:20 #22838

    • SHirsch
    • SHirsch's Avatar


  • Posts: 259
  • Hallo Franz,

    das Senden erfolgt bei deinem Beispiel direkt hintereinander. Kommen die beiden Nachrichten vielleicht zusammen an? Was ist denn auf der Serverseite zu sehen? Was kommt bei deinem Logger genau an?

    Mach mal zwischen die beiden SendLine ein Sleep(1000) rein und probier erneut.

    Stefan

    Please Log in or Create an account to join the conversation.

    SerialLib Klasse für VO 2.8 23 Jun 2022 14:51 #22839

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 310
  • Hallo Stefan,
    den Sleep dazwischen hab ich schon probiert, hilft aber nichts.

    Ich habe meine App nun aufs Minimum reduziert und beigelegt. Der Echo Protocol Server von VO ist nicht dabei, weil original VO. Defaultmäßig sendet meine App nach 127.0.0.1 Port 7.

    File Attachment:

    File Name: LFSTest.zip
    File Size:5 KB
    Attachments:

    Please Log in or Create an account to join the conversation.

    SerialLib Klasse für VO 2.8 23 Jun 2022 15:11 #22840

    • SHirsch
    • SHirsch's Avatar


  • Posts: 259
  • dein Programm funktioniert. In TcpView sieht man 2 Nachrichten.
    Mit meinem eigenen TCPServer sehe ich auch beide Nachrichten. Der EchoServer scheint also das Problem zu sein.
    Stefan

    Please Log in or Create an account to join the conversation.

    Last edit: by SHirsch.

    SerialLib Klasse für VO 2.8 23 Jun 2022 15:21 #22841

    • Karl-Heinz
    • Karl-Heinz's Avatar


  • Posts: 773
  • Hallo Franz,

    Wenn es mit dem SendLine() ein Problem gibt müsste die Methode lt. Doku dann ja 0 zurückgeben.
    Number of data sent, if successful; otherwise, 0 (zero).

    Falls 0, würde ich mir mal die Properties Error, ErrorMsg und Status anzeigen lassen. Sehe gerade, dass es auch noch eine Methode DisplayError() gibt.

    Gruß
    Karl-Heinz

    Please Log in or Create an account to join the conversation.

    SerialLib Klasse für VO 2.8 23 Jun 2022 16:38 #22844

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 310
  • Ich habe die Anwendung jetzt so umgebaut, dass nach jeder Antwort vom EchoSrv wieder eine neue Anfrage gesendet wird. Also müßte das ganze jetzt wie beim PingPong immer hin- und hergehen, was es aber nicht tut. Ab der 2. Sendung kommt Error 10060 Timeout zurück. Außerdem scheint die ganze Kommunikation ziemlich asynchron zu sein und die Anwendung crashed auch ziemlich unbegründet in ihrer Schleife.

    Der Unterschied zum EchoClt ist, dass dort mit jedem man. Sendevorgang ein neuer Socket eröffnet wird. Daher ist jede Sendung immer die erste Sendung und es gibt keine Schleife.

    File Attachment:

    File Name: LFSTest.zip
    File Size:5 KB
    Attachments:

    Please Log in or Create an account to join the conversation.

    SerialLib Klasse für VO 2.8 23 Jun 2022 16:52 #22845

    • SHirsch
    • SHirsch's Avatar


  • Posts: 259
  • Hallo Franz,

    Du machst nach dem CreateVOThread ein CloseHandle. Ich denke das sollte erst aufgerufen werden wenn der Thread beendet wurde.

    Für weitere Test würde ich als erstes mal das Threading Zeug rausschmeißen. Bau dir ein Schleife in der du sendest und empfängst. Immer schon im Wechsel. Wenn das geht, fängst du an Stück für Stück umzubauen. Und wenn du unbedingt mit Thread arbeiten möchtest, dann sollte sich dieser auf das wesentlich beschränken: Daten abholen und zur Weiterverarbeitung bereitstellen. EndDialog und ApplicationExec gehören definitiv nicht in einen Thread sondern ins Hauptprogramm.

    Stefan

    Please Log in or Create an account to join the conversation.

    Last edit: by SHirsch.

    SerialLib Klasse für VO 2.8 23 Jun 2022 17:13 #22848

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 310
  • Hallo Stefan,
    unter VO 2.7 funktioniert das Originalprogramm mit diesem Thread genau in dieser Form. Neu hinzugekommen sind nur die Anzeigen mit ? und das neuerliche Senden
    IF !Empty(cLine)
    	nRet := oDta:_oSocket:SendLine("INFO#Next")     // Kommt nicht an
    ELSE
    ENDIF
    damits eine Schleife ergibt. In der Praxis schauts so aus, dass nach dem ersten Senden der Infonachricht gewartet wird, dass der crdServer meldet "Karte gesteckt" und dann gibts erst die Rückantwort "Auswurf vorn" oder "Auswurf hinten".

    Ich versuche mal den EchoSrv so umzubauen, dass genau dieser Ablauf gegeben ist.

    Please Log in or Create an account to join the conversation.

    SerialLib Klasse für VO 2.8 23 Jun 2022 19:42 #22851

    • g.bunzel@domonet.de's Avatar


  • Posts: 83
  • Hallo Franz,
    zuerst habe ich habe den Thread-Kram rausgeschmissen und auf Timer umgestellt - hat nicht funktioniert.
    Dann alle Varianten für das Senden getestet (:SendLine(), SendLineTo(), SendRaw(), ...). Die Rückmeldung auch mit dem Debugger zu den Methoden war immer 'Successful' - im EchoServer ist aber immer nur die erste Zeile angekommen. Auch mit dem Debugger nix gefunden.
    Der VO-EchoClient erstellt für jede Nachricht ein neues Objekt oSocket, sendet dann mit :SendLineTo() und zerstört das Objekt wieder mit :Axit(). Anscheinend funktioniert der EchoServer nur so richtig.
    Ich habe dann einen anderen EchoServer gesucht. Dort sind dann alle Nachrichten mit :SendLine() - und auch mit allen anderen Send-Methoden sofort angekommen. Auch eine #ENDE-Nachricht wird noch gesendet.
    Das ist der SocketTest, mit dem ich getestet habe: sockettest.sourceforge.net/
    Der SocketTest antwortet leider nicht autom.mit den gesendeten Nachrichten. Alle mit 'Send' gesendeten Texte sind aber im VO-Fenster angekommen. Das funktioniert also auch mit einem Timer und ist einfacher und übersichtlicher als mit einem Thread.
    Das Problem liegt also wohl nicht an dem :SendTo() in Deiner Anwendung.

    HTH

    Gerhard Bunzel
    Attachments:

    Please Log in or Create an account to join the conversation.

    Last edit: by .

    SerialLib Klasse für VO 2.8 24 Jun 2022 08:51 #22858

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 310
  • Hallo Gerhard,
    danke für deine Bemühungen! Dass der Echo Client immer wieder einen neuen Socket öffnet habe ich in Msg #22844 auch bemerkt und geschrieben.

    Inzwischen habe ich den Echo Server und den Echo Client so umgebaut, dass diese die gewünschte Kommunikation bidirektional abwickeln. Wegen dem Thread ist einiges an Absicherungen und Abfragen notwendig, damit dies vernünftig funktioniert. Ich schau mir mal an wie es mit Timer funktioniert, beim Kunden wird irgendwann mal auf eine neue Hardware umgestellt, vielleicht kann ich dann das Prog dabei mit umstellen.

    Ablauf für einen Test:
    - CrdServer mit Button Start aktivieren
    - CrdClient mit Button Start Kommunikation aktivieren
    - Im CrdServer mit den 3 Buttons Eingang, Ausgang, Nacht das Einstecken von Karten simulieren

    File Attachment:

    File Name: LFSTest.zip
    File Size:33 KB
    Attachments:

    Please Log in or Create an account to join the conversation.

    Last edit: by lagraf.

    SerialLib Klasse für VO 2.8 24 Jun 2022 10:32 #22859

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 310
  • Hab gesehen, dass die CrdClient Antworten WITHDRAW und EJECT beim CrdServer wieder nicht ankommen. Ist mir aber jetzt egal, der unbezahlte Aufwand dafür wird mir nun zu groß.
    Danke für euren Input!

    PS Gerhard: Wie würde das mit dem Timer funktionieren - Wenn der Timer anspringt, Socket öffnen, schauen ob eine Nachricht vorliegt, Socket schließen? Oder welchen Ablauf hattest du im Timer?

    Please Log in or Create an account to join the conversation.

    Last edit: by lagraf.

    SerialLib Klasse für VO 2.8 24 Jun 2022 12:35 #22860

    • g.bunzel@domonet.de's Avatar


  • Posts: 83
  • Hab die Test-App schon gelöscht. Das mit dem Timer ist aber recht einfach.

    Wenn die Connection gestartet wird, auch den Timer starten. Vorher kann es ja noch keine Nachrichten geben:
    SetTimer (SELF:handle (), 2000, 500, NULL_PTR)

    Im Dispatcher des Fenster dann auf die Timernachricht warten und oSocket so abarbeiten, wie im Thread:
    METHOD Dispatch (oEvent) CLASS MyWindow
    LOCAL oEvt AS @@Event

    oEvt := oEvent

    DO CASE
    CASE oEvt:message == WM_Timer
    DO CASE
    CASE oEvt:wParam == 2000 // ID des Timers
    cLine := SELF:_oSocket:GetLine()
    ........

    ENDCASE
    ENDCASE

    RETURN SUPER:Dispatch (oEvt)

    Wenn die Connection beendet wird auch den Timer beenden:
    KillTimer (SELF:handle (), 2000)

    HTH
    Gerhard Bunzel

    Please Log in or Create an account to join the conversation.

    Last edit: by .

    SerialLib Klasse für VO 2.8 25 Jun 2022 12:24 #22871

    • softdevo@tiscali.it's Avatar


  • Posts: 174
  • I used this code, I hope it still works

    Danilo Giuliani
    Attachments:

    Please Log in or Create an account to join the conversation.

    SerialLib Klasse für VO 2.8 27 Jun 2022 06:59 #22886

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 310
  • Hi Danilo,
    thank you for the code, but I already got it from Wolfgang.
    Franz

    Please Log in or Create an account to join the conversation.

    • Page:
    • 1
    • 2
    Moderators: wriedmann