SerialLib Klasse für VO 2.8

Deutschsprachiges X#-Forum – German language forum

Moderator: wriedmann

lagraf
Posts: 417
Joined: Thu Jan 18, 2018 9:03 am

SerialLib Klasse für VO 2.8

Post by lagraf »

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.
User avatar
wriedmann
Posts: 3644
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

SerialLib Klasse für VO 2.8

Post by wriedmann »

Hallo Franz,
siehe hier:
Serial28.zip
(8.47 KiB) Downloaded 43 times
Wolfgang
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
lagraf
Posts: 417
Joined: Thu Jan 18, 2018 9:03 am

SerialLib Klasse für VO 2.8

Post by lagraf »

Danke Wolfgang!
Ich habe die Lib eingebunden in meine App und das EXE an den Kunden geschickt, bin gespannt.
LG Franz
User avatar
wriedmann
Posts: 3644
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

SerialLib Klasse für VO 2.8

Post by wriedmann »

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
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
lagraf
Posts: 417
Joined: Thu Jan 18, 2018 9:03 am

SerialLib Klasse für VO 2.8

Post by lagraf »

Hallo Wolfgang,
ich habe nichts Auffälliges bemerkt. Was könnte den Fehler
image001.png
image001.png (11.46 KiB) Viewed 373 times
bewirken, der Code von Logging is folgender:

Code: Select all

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?
g.bunzel@domonet.de
Posts: 97
Joined: Tue Mar 01, 2016 11:50 am
Location: Germany

SerialLib Klasse für VO 2.8

Post by g.bunzel@domonet.de »

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
lagraf
Posts: 417
Joined: Thu Jan 18, 2018 9:03 am

SerialLib Klasse für VO 2.8

Post by lagraf »

Hallo Gerhard,
zur Funktion Logging kommt es wie folgt (hier nur die relevanten Teile aus dem Sourcecode):

Code: Select all

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.
g.bunzel@domonet.de
Posts: 97
Joined: Tue Mar 01, 2016 11:50 am
Location: Germany

SerialLib Klasse für VO 2.8

Post by g.bunzel@domonet.de »

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
lagraf
Posts: 417
Joined: Thu Jan 18, 2018 9:03 am

SerialLib Klasse für VO 2.8

Post by lagraf »

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ß?
g.bunzel@domonet.de
Posts: 97
Joined: Tue Mar 01, 2016 11:50 am
Location: Germany

SerialLib Klasse für VO 2.8

Post by g.bunzel@domonet.de »

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
Post Reply