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

TOPIC:

SerialLib Klasse für VO 2.8 08 Jun 2022 10:59 #22698

  • lagraf
  • lagraf's Avatar
  • Topic Author


  • Posts: 338
  • Hallo,l
    gibt es irgendwo die SerialLib Klasse von Ginny für VO 2.8?

    Ich habe eine VO 2.7 App mit dieser Klasse auf VO 2.8 umstellen müssen, weil eine Änderung gewünscht wurde und ich VO 2.7 nicht mehr installiert habe. Die diversen Fehler und Warnings beim Compilieren der App und der SerialLib mit VO 2.8 habe ich ausgebessert und die App auf den Kundenrechner überspielt. Sie stürzt aber leider beim Zugriff auf die ser. Schnittstellen ab. Ich gehe daher davon aus, dass ich beim Ausbessern der Meldungen in der SerialLib irgendwas falsch gemacht habe.

    Das Problem dabei ist, dass die App auf 4 ser. Schnittstellen (2 Waagen und 2 Magnetkartenleser) zugreift und ich diese Hardware bei mir nicht habe und deshalb nichts testen kann. Der Kundenrechner ist per Fernwartung nicht erreichbar und hat ausserdem einen 24/7 Betrieb, sodaß ich darauf keine Tests durchführen kann. Ich hatte gehofft, dass die App mit VO 2.8 genauso funktioniert wie mit VO 2.7. Für jeden Test muss ich die App per Mail an den Kunden schicken, der spielt sie in einer ruhigen Minute ein und gibt mir dann die Rückmeldung.

    Vielleicht gibt es irgendwo schon eine mit VO 2.8 kompilierte SerialLib, die funktioniert.

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

    SerialLib Klasse für VO 2.8 08 Jun 2022 11:10 #22701

    • wriedmann
    • wriedmann's Avatar


  • Posts: 3367
  • Hallo Franz,
    siehe hier:

    File Attachment:

    File Name: Serial28.zip
    File Size:8 KB

    Wolfgang
    Wolfgang Riedmann
    Meran, South Tyrol, Italy

    www.riedmann.it - docs.xsharp.it
    Attachments:

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

    SerialLib Klasse für VO 2.8 08 Jun 2022 11:46 #22705

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 338
  • Danke Wolfgang!
    Ich habe die Lib eingebunden in meine App und das EXE an den Kunden geschickt, bin gespannt.
    LG Franz

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

    SerialLib Klasse für VO 2.8 08 Jun 2022 11:51 #22706

    • wriedmann
    • wriedmann's Avatar


  • Posts: 3367
  • Hallo Franz,
    hast Du auch kontrolliert, was in Deiner Lib anders ist als in der, die ich Dir geschickt habe?
    Einfach beide Klassen in ein prg-File exportieren und dann mit einem Tool vergleichen.....
    Ich vermute, da ist ein cast falsch gemacht.
    Wolfgang
    Wolfgang Riedmann
    Meran, South Tyrol, Italy

    www.riedmann.it - docs.xsharp.it

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

    SerialLib Klasse für VO 2.8 08 Jun 2022 12:44 #22707

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 338
  • Hallo Wolfgang,
    ich habe nichts Auffälliges bemerkt. Was könnte den Fehler

    bewirken, der Code von Logging is folgender:
    FUNCTION Logging(dwParam AS DWORD) AS INT PASCAL
    	LOCAL oDta AS dtaSocket
    	LOCAL t1 AS TParams
    	LOCAL cLine AS STRING
    	LOCAL nError := 0 AS DWORD
    
    	t1 := dwParam
    	oDta := OBJECT(_CAST,t1.MainDlg)
    
    	WHILE TRUE
    		oDta:oSocket:listen(1)     // --> Zeile 11
    		cLine := oDta:oSocket:GetLine()
    		// Wenn Codes 10050 bzw. 10056 wieder zurückgehen auf 0 ist CRDServer gestorben
    		IF nError > 0 .AND. oDta:oSocket:Error == 0
    			oDta:DoAnswer(TRUE, "CRDServer Fehler")
    			oDta:EndWindow()
    			ExitVOThread(0)
    			EXIT
    		ENDIF
    		nError := oDta:oSocket:Error
    		IF !Empty(cLine)
    			oDta:Speichern(cLine)
    		ENDIF
    
    		IF oDta:lStop
    			oDta:DoAnswer(TRUE, "Thread beendet")
    			oDta:oSocket:Disconnect()
    			oDta:oSocket := NULL_OBJECT
    			ExitVOThread(0)
    			EXIT
    		ENDIF
    		ApplicationExec(EXECWHILEEVENT)
    	END
    	
    	RETURN 0
    Hast du vielleicht eine Idee?
    Attachments:

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

    SerialLib Klasse für VO 2.8 08 Jun 2022 13:14 #22708

    • g.bunzel@domonet.de's Avatar


  • Posts: 90
  • Hallo Franz,

    es wird ein Object oDta (das ist wohl dtaSerial) aus einem Parameter erstellt.
    Von diesem dtaSerial wäre der Code von :DoAnswer() und auch was oSocket dort macht interessant zu sehen, um da etwas mehr Info zu bekommen.
    Wozu wird da ein Thread verwendet, der in der Funktion mit ExitVOThread(0) beendet wird?
    Ich mache sehr viel mit seriellen Schnittstellen - auch mehrere gleichzeitig. Dazu war aber noch nie ein oder mehrere Threads erforderlich.
    Gruss
    Gerhard

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

    SerialLib Klasse für VO 2.8 08 Jun 2022 13:45 #22709

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 338
  • Hallo Gerhard,
    zur Funktion Logging kommt es wie folgt (hier nur die relevanten Teile aus dem Sourcecode):
    CLASS dtaSocket INHERIT dtaSerial     // dtaSerial ist ein generiertes Form mit MLEs zur Protokollierung der Vorgänge
    PROTECT _oSocket as CSocket
    PROTECT _cIP AS STRING
    PROTECT _nPort AS WORD
    PROTECT _lStop AS LOGIC
    PROTECT _t1 AS TParams
    PROTECT _cCard AS STRING		// CRDServer Kommando Lead-In: *@*#Card?#
    
    METHOD Setup(nIndex) CLASS dtaSocket
    	LOCAL nID AS DWORD
    	LOCAL pTask AS PTR
    
    	// Socket erstellen
    	_oSocket := CSocket{SOCK_STREAM}
    	_oSocket:Timeout:=100
    	IF !_oSocket:connect(_cIP, _nPort)
    		SELF:DoAnswer(TRUE, "Keine Verbindung zum CRDServer")
    	ELSE
    		SELF:DoAnswer(TRUE, "Verbindung zum CRDServer")
    	
    		// Thread starten für Listening
    		_lStop := FALSE
    		_t1:=MemAlloc(_SIZEOF(TParams))
    		RegisterKid(_t1,1,FALSE)
    		_t1.MainDlg:=PTR(_CAST,SELF)
    		pTask:=CreateVOThread(NULL,0,@Logging(),_t1,0,@nID)
    		IF pTask <> NULL_PTR
    			SELF:DoAnswer(TRUE, "Thread Listener gestartet")
    		ELSE
    			SELF:DoAnswer(TRUE, "Thread Listener nicht gestartet")
    		ENDIF
    		CloseHandle(pTask)
    
    		// INFO-Nachricht senden
    		SELF:GenerateEvent(_cCard+"INFO#")
    	ENDIF
    
    	RETURN SELF
    	
    METHOD GenerateEvent(cMsg) CLASS dtaSocket
    	IF _oSocket:Sendline(cMsg) > 0
    		SELF:DoAnswer(FALSE, cMsg+"...OK")
    	ELSE
    		SELF:DoAnswer(FALSE, cMsg+"...Error")
    	ENDIF
    	RETURN SELF
    
    STRUCTURE TParams
    	MEMBER MainDlg AS PTR
    
    METHOD DoAnswer(lShow, cStr) CLASS dtaSerial
    	SELF:oDCmleCommLog:TextValue += cStr + CHR(13) + CHR(10)
    	SELF:MleKuerzen()
    	RETURN SELF
    Das Originalprogramm ist inzwischen 25-30 Jahre alt und stammt wahrscheinlich noch aus der VO 1.x Zeit, hat seitdem bis VO 2.7 funktioniert. Ob dafür ein Thread notwendig ist, weiß ich auch nicht. DoAnswer protokolliert nur Meldungen in den MLEs von dtaSerial.

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

    SerialLib Klasse für VO 2.8 08 Jun 2022 14:50 #22710

    • g.bunzel@domonet.de's Avatar


  • Posts: 90
  • Hallo Franz,

    ...ok. Dieser Code hat ja aber gar nix mit der seriellen Schnittstelle zu tun.
    Der Grund für die Fehlermeldung liegt wohl eher an Änderungen in der cSocket-Klasse. von VO2.7 auf VO2.8.
    In den 'WhatsNew-Dokumenten' zu den VO28-Versionen habe ich nur das hier zu Sockets gefunden:
    · Resolved memory problems in CSocket:getpeername() and CSocket:getsockname()

    Gruss
    Gerhard

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

    SerialLib Klasse für VO 2.8 08 Jun 2022 15:38 #22711

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 338
  • Hallo Gerhard,
    der Kunde hat noch immer den uralten XP Rechner im Einsatz. Kann es ev. daran liegen, dass die mit VO 2.8 compilierte Version deshalb beim Zugriff auf die ser. Schnittstelle abstürzt?

    Ich versuche mal auf einer alten Platte die VO 2.7 zu installieren, was war die letzte Version davon? Allerdings habe ich seit 2.0 lauter Upgrades, wie kann ich da am Besten vorgehen, damit ich nicht mit 1.0 starten muß?

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

    Last edit: by lagraf.

    SerialLib Klasse für VO 2.8 08 Jun 2022 16:20 #22712

    • g.bunzel@domonet.de's Avatar


  • Posts: 90
  • Hallo Franz,

    >deshalb beim Zugriff auf die ser. Schnittstelle abstürzt?
    Dein Programmcode nutzt KEINE SERIELLE SCHNITTSTELLE!!!
    Zumindest nicht der Code, den du hier gezeigt hast.

    Gruss
    Gerhard

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

    SerialLib Klasse für VO 2.8 08 Jun 2022 16:47 #22713

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 338
  • Hallo Gerhard,
    du hast Recht, die beiden Magnetkartenleser, wo der Absturz stattfindet, werden über Sockets angesprochen. Die beiden Waagen über ser. Schnittstellen. Das wurde mal von 4 ser. Schnittstellen umgestellt, hatte das noch immer so im Kopf.

    Dann also so: Kann es daran liegen dass die Sockets mit VO 2.8 nicht funktionieren, weil der Kundenrechner noch ein XP Rechner ist?

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

    SerialLib Klasse für VO 2.8 09 Jun 2022 11:42 #22719

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 338
  • Ich habe das Problem gefunden:
    CLASS dtaSocket INHERIT dtaSerial
    	EXPORT  _oSocket AS CSocket
    
    METHOD Setup(nIndex) CLASS dtaSocket
    	LOCAL t1 AS TParams
    ...
    	_t1 := MemAlloc(_SIZEOF(TParams))
    	RegisterKid(_t1, 1, FALSE)
    	_t1.MainDlg := PTR(_CAST, SELF)
    	pTask:=CreateVOThread(NULL, 0, @Logging(), _t1, 0, @nID)   // Übergabe an Func Logging _t1 = dtaSocket
    
    ACCESS oSocket CLASS dtaSocket
    	RETURN _oSocket
    
    FUNCTION Logging(dwParam AS DWORD) AS INT PASCAL
    	LOCAL oDta AS dtaSocket
    	LOCAL t1 AS TParams
    ...
    	t1 := dwParam
    	oDta := OBJECT(_CAST,t1.MainDlg)
    	WHILE TRUE
    		oDta:oSocket:listen(1)     // oDta:oSocket über ACCESS bringt Absturz
    		oDta:_oSocket:listen(1)     // oDta:_oSocket über EXPORT Var funktioniert
    Der Zugriff über ACCESS bringt das Prog zum Absturz, ich weiß allerdings nicht warum. Der direkte Zugriff über die EXPORT Variable funktioniert hingegen.

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

    SerialLib Klasse für VO 2.8 09 Jun 2022 11:57 #22720

    • ArneOrtlinghaus
    • ArneOrtlinghaus's Avatar


  • Posts: 348
  • Wenn der Kunde noch XP hat und das Programm sonst nicht testbar ist, dann würde ich sagen:
    Keine einzige Änderung, die nicht unbedingt notwendig, also auch unbedingt mit der alten VO-Version weiterarbeiten.
    Es werden Threads benutzt und die geben in Zusammenhang mit der GUI und vielen anderen Klassen unter Umständen Fehler in Zusammenhang mit dem Garbage Collector.
    Das, was auch sehr gefährlich aussieht, ist das Casten von Objekten aus Pointerstrukturen. Die Frage ist immer, ob der Pointer immer noch auf das korrekte Objekt zeigt, nachdem der Garbage Collector gelaufen ist. Und beim Garbage Collector hat sich viel verändert von VO 2.7 auf VO 2.8 (meistens zum Positiven, aber es reichen hier kleine Veränderungen).
    Ich selbst würde hier als erstes die Casts auf die Objekte ändern, indem ich ein globales Array mit Objekten anlegen würde und der Thread nur eine Nummer bekommt und dann aus dem globalen Array das richtige Objekt rausholen kann. Das ist zwar auch nicht schön, aber das verhindert, dass der Garbage Collector durcheinanderkommen kann.
    In einem Thread darf es nichts geben, dass den Garbage Collector anstoßen kann. Oder als Ersatzlösung muss so viel dynamischer Speicher bei Programmstart reserviert werden, dass der Garbage Collector (hoffentlich) nicht während der Threadausführung anfängt zu laufen. Das kann man mit AppSetDynMem steuern mit ausreichend großen Werten.
    Arne

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

    SerialLib Klasse für VO 2.8 09 Jun 2022 12:07 #22721

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 338
  • Hallo Arne,
    danke dir für die Infos! Die Fehlerursache habe ich inzwischen gefunden, hast du mein Posting 15min vor deinem gesehen?

    Info über den Kunden:
    Es handelt sich um eine weltweite Großfirma mit ca. 3000 Leuten nur an diesem einen Standort. Die haben auch in der nächsten Zeit (also wohl in den nächsten 2 Jahren) vor, den Rechner von XP auf neuere Hardware und OS umzustellen. Aber das ist dort ein Projekt für 4-5 Mann und mind. 2 Wochen Aufwand!

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

    SerialLib Klasse für VO 2.8 09 Jun 2022 12:21 #22722

    • ArneOrtlinghaus
    • ArneOrtlinghaus's Avatar


  • Posts: 348
  • Umso besser, dass es jetzt wieder läuft. Aber es läuft ja nur wegen einer kleinen Anpassung, die eigentlich ja nicht der Grund sein sollte.

    Da kann man sich nur fragen, welche Bedeutung IT-Sicherheit und -Stabilität bei dem Kunden hat, wenn das dann ein wichtiges Produktivsystem ist.

    Ich gebe zu, dass wir bei uns in unserer Entwicklungsabteilung bis Anfang letzten Jahres noch einen virtualisierten Windows Server 2003 hatten (entspricht ja der Windows XP-Zeit). Wir brauchten noch eine alte Datenbankversion aus Kompatibilitätszwecken, weil einige Kunden auch noch so alte Rechner hatten. Da unsere Programme jetzt nicht mehr mit der alten Datenbankversion zu betreiben waren, war automatisch Schluß, sobald sie auf eine aktuelle Programmversion umsteigen wollten.

    Gruß
    Arne

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

    SerialLib Klasse für VO 2.8 09 Jun 2022 12:50 #22723

    • g.bunzel@domonet.de's Avatar


  • Posts: 90
  • Hallo Franz,

    gut, wenn es jetzt funktioniert.

    Ich hätte so einen ACCESS mit 'Strong Typing' erstellt - evtl. macht das einen Unterschied.

    ACCESS oSocket AS CSocket CLASS dtaSocket
    RETURN SELF:_oSocket

    Gruss

    Gerhard

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

    Last edit: by .

    SerialLib Klasse für VO 2.8 09 Jun 2022 13:41 #22724

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 338
  • Arne: Ich muss dazu sagen, dass der Rechner nur lokal verwendet wird und nicht im Internet hängt. Aber bei so großen Firmen ist ein Umstieg, vor allem bei 24/7 Betrieb, nicht einfach. Da wollen/müssen viele Leute mitreden und koordiniert werden!

    Gerhard: Ich habs mit Strongtyping getestet, aber stürzt auch damit ab.

    Ich habe eine Software namens CardServer gefunden, welche die beiden Magnetkartenleser steuert und mit meinem Prog per Socket kommuniziert. Wenn ich die nicht hätte, würde ich beim Test gar nicht bis zu der ursprünglichen Fehlerposition kommen, sondern schon beim Connect scheitern. Gut wenn man auch 25 Jahre alte Software nicht wegwirft!

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

    SerialLib Klasse für VO 2.8 23 Jun 2022 10:44 #22830

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 338
  • Aktueller Stand:
    Damit der Kunde arbeiten kann, habe ich ihm die Software mit VO2.7 geändert und ausgeliefert. Ich würde aber interessehalber und um VO2.7 wegzubekommen die Software noch unter VO 2.8 zum Laufen bringen. Da ich aber die Hardware nicht habe, kann ich die Abläufe nicht testen.

    Meine Idee zum Test ohne Hardware:
    Die beiden Magnetkartenleser werden von einer Software namens crdreader verwaltet. Diese kommuniziert per Socket mit meinem Programm bidirektional. Meine Idee ist jetzt, mir aus dem EchoSrv einen eigenen crdreader zu machen, der mir die Zugriffe auf die Magnetkarten simuliert und die Antworten retourniert.

    Dabei habe ich aber das Problem, dass ich die erste Anfrage an den EchoSrv absetzen kann, diese wird dort im Fenster angezeigt, aber jede weitere Anfrage bewirkt nichts mehr. Nachfolgend das Setup für den Thread gekürzt aufs Wesentliche und 2 Dummyanfragen:
    CLASS dtaSocket INHERIT dtaSerial
    	EXPORT  _oSocket AS CSocket
    	PROTECT _t1 AS TParams
    	PROTECT _cIP AS STRING
    	PROTECT _nPort AS WORD
    
    METHOD Setup(nIndex) CLASS dtaSocket
    	LOCAL nID AS DWORD
    	LOCAL pTask AS PTR
    
    	// Socket erstellen
    	_oSocket := CSocket{SOCK_STREAM}
    	_oSocket:Timeout:=100
    	IF _oSocket:connect(_cIP, _nPort)
    	
    		// Thread starten für Listening
    		_lStop := FALSE
    		_t1 := MemAlloc(_SIZEOF(TParams))
    		RegisterKid(_t1, 1, FALSE)
    		_t1.MainDlg := PTR(_CAST, SELF)
    		pTask:=CreateVOThread(NULL, 0, @Logging(), _t1, 0, @nID)
    		CloseHandle(pTask)
    
    		// Nachricht senden
    		_oSocket:SendLine("INFO#1")     // Kommt beim EchoSrv an, Antwort in Func Logging retour
    		_oSocket:SendLine("INFO#2")     // Kommt nicht an
    	ENDIF
    	RETURN SELF
    Was könnte das Problem sein, dass nur die erste Anfrage an den EchoSrv dort ankommt?

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

    SerialLib Klasse für VO 2.8 23 Jun 2022 11:01 #22831

    • ArneOrtlinghaus
    • ArneOrtlinghaus's Avatar


  • Posts: 348
  • Die serielle Schnittstelle ist extrem tückisch. Wenn dann noch Thread-Programmierung dazukommt, dann wird das noch schwieriger. Meiner Meinung nach müsstest du die Kommunkation mit externen Programmen wie Telnet machen. Es kommt natürlich auf das Protokoll an, wie oft sich Programm und Kartenleser Daten hin- und her- schicken.

    Wenn das Programm so schwer zu testen ist, ist die Frage, warum du es auf VO 2.8 zum Laufen bringen willst. Im Grunde ist VO 2.8 auch ein Auslaufmodell.
    Gruß
    Arne

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

    SerialLib Klasse für VO 2.8 23 Jun 2022 11:56 #22832

    • lagraf
    • lagraf's Avatar
    • Topic Author


  • Posts: 338
  • Hallo Arne,
    die beiden seriellen Schnittstellen bedienen die Waagen, habe aber nichts mit dem Problem zu tun. Die beiden Magnetkartenleser werden über Sockets angesprochen: MeinProg <-> crdreader <-> Hardware. Und da gibt es anscheinend zwischen VO 2.7 und VO 2.8 Unterschiede. Eine Umstellung auf X# ist nicht möglich, der Kunde will das Prog solange laufen lassen, bis eine Alternative gefunden wird. Außerdem wird der Unterschied zwischen VO 2.7 und X# noch größer sein als der zwischen VO 2.7 und VO 2.8.

    Alle meine Programme bei den Kunden laufen noch mit VO2.8 und daran wird sich nichts ändern, solange VO auf Windows funktioniert. Nur möchte ich wegen 1 einzigen App nicht noch VO 2.7 mitschleppen müssen.

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

    • Page:
    • 1
    • 2
    Moderators: wriedmann