Das Forentreffen 2018 findet am 20./21. April in Dresden statt. Weitere Infos hier
Zur Homepage des Deutschsprachige Xbase-Entwickler e. V.
Xbase++-Wiki des Deutschsprachige Xbase-Entwickler e. V.

Thread und Frax

Moderator: Moderatoren

Antworten
Benutzeravatar
Werner_Bayern
Programmier-Gott
Programmier-Gott
Beiträge: 1288
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Thread und Frax

Beitrag von Werner_Bayern » Do, 05. Dez 2013 15:28

Servus,

habe ich das richtig verstanden, dass Frax nicht thread-safe ist, weil init und destroy direkt wirken?

Bei mir knallt es, wenn der 2. Report geschlossen wird, wohl weil das destroy ins Leere geht, obwohl das 2 saubere Threads sind:

Code: Alles auswählen

   oFrax := frReportManager():new("FRSyst.dll")
   oFrax:SetIcon(4)
   oFrax:SetTitle("Abrechnung Konto")
   oFrax:SetUserDataSet("Daten", "Datum;Buchungstext;Konto;Soll;Haben;Brutto;Belegnr;Saldo",;
   {||I := 1}, {||I := I + 1}, {||I := I - 1}, {||I > Len(aDaten)}, ;
   {| cFeld | aDaten[i, ascan({"Datum", "Buchungstext", "Konto", "Soll", "Haben", "Brutto", "Belegnr", "Saldo"}, cFeld)]})
   oFrax:LoadFromFile("kontenabrechnung.fr3")
   oFrax:ShowReport()
   oFrax:ClearDatasets()
   oFrax:DestroyFR()
es grüßt euch

Werner

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13764
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Thread und Frax

Beitrag von brandelh » Do, 05. Dez 2013 15:48

was passiert wenn du das destroyFR weg läßt ?

Eigentlich dürfte ein destroy nur das eigentliche oFrax zerstören, vermutlich ist die DLL Referenz nicht sauber umgesetzt.
Allerdings müsste es dann beim nächsten Zugriff knallen und nicht erst beim nächsten destroy.
Gruß
Hubert

Benutzeravatar
Werner_Bayern
Programmier-Gott
Programmier-Gott
Beiträge: 1288
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: Thread und Frax

Beitrag von Werner_Bayern » Do, 05. Dez 2013 16:08

korrekt, dann knallt es mit gleicher Fehlermeldung beim nächsten Aufruf, sobald 1x ein betroffener Thread beendet wird. Wird kein thread beendet, würde es gehen. :)
es grüßt euch

Werner

Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1963
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Kontaktdaten:

Re: Thread und Frax

Beitrag von Koverhage » Do, 05. Dez 2013 16:13

Ich würde vermuten das es hieran liegt
oFrax:ClearDatasets()
Gruß
Klaus

Benutzeravatar
Werner_Bayern
Programmier-Gott
Programmier-Gott
Beiträge: 1288
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: Thread und Frax

Beitrag von Werner_Bayern » Do, 05. Dez 2013 16:26

Koverhage hat geschrieben:Ich würde vermuten das es hieran liegt
oFrax:ClearDatasets()
Nein, das hatte ich nur reingemacht aufgrund eines älteren Hinweises hier in diesem Forum.
es grüßt euch

Werner

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13764
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Thread und Frax

Beitrag von brandelh » Do, 05. Dez 2013 16:28

wenn die DLL als solche nicht threadsave ist, dann muss man den gleichzeitigen Aufruf verhindern.
Solange nur Reports generiert werden, könnte man eine Schleife generieren, die die Reports erstellt - also eine Reportqueue.

Ist das Xbase++ code der knallt oder in der DLL ?
Gruß
Hubert

Benutzeravatar
Werner_Bayern
Programmier-Gott
Programmier-Gott
Beiträge: 1288
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: Thread und Frax

Beitrag von Werner_Bayern » Do, 05. Dez 2013 16:35

Code: Alles auswählen

Xbase++ Version     : Xbase++ (R) Version 1.90.355
Betriebssystem      : Windows Vista 06.00 Build 06002 Service Pack 2
------------------------------------------------------------------------------------------
oError:args         :
          -> VALTYPE: C VALUE: _DLL  xìV¤ u
          -> VALTYPE: N VALUE: 0
oError:canDefault   : N
oError:canRetry     : N
oError:canSubstitute: J
oError:cargo        : NIL
oError:description  : Interne Datenstrukturen beschädigt
oError:filename     : 
oError:genCode      :         41
oError:operation    : dllExecuteCall
oError:osCode       :          0
oError:severity     :          2
oError:subCode      :          5
oError:subSystem    : BASE
oError:thread       :          4
oError:tries        :          0
------------------------------------------------------------------------------
CALLSTACK:
------------------------------------------------------------------------------
Aufgerufen von FRREPORTMANAGER:FRNOTIFYERROR(1206)
Aufgerufen von (B)FRREPORTMANAGER:SHOWREPORT(1300)
Aufgerufen von FRREPORTMANAGER:SHOWREPORT(1302)
Aufgerufen von KONTOAUSG(430)
es grüßt euch

Werner

Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 780
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg

Re: Thread und Frax

Beitrag von Lewi » Do, 05. Dez 2013 18:02

Hallo!
oFrax:DestroyFR() führt zwangsläufig zum Entladen der Frax-DLL.

Eventuell hilft eine Klassenerweiterung der Klasse "FrReportManager()" um eine Methode "DestroyReport()"

Code: Alles auswählen

METHOD frReportManager:DestroyReport()
   ::PrintOptions := NIL
   ::PreviewOptions := NIL
   ::EngineOptions := NIL
   ::ReportOptions := NIL
   ::DllExecuteCall(::_CloseSyst)    // <- evtl. schauen, welche Wirkung eine Auskommentierung hat.
   ::frSystHandle := 0
RETURN self
Hinweis: Der Klassen-Code ist in der Datei FastRep.prg hinterlegt und muss zur Anwendung dazu gelinkt werden.

Gruß, Olaf

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13764
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: Thread und Frax

Beitrag von brandelh » Do, 05. Dez 2013 21:07

eine DLL zu entladen ist keine gute Idee !

Wenn ich das bei der QuickPDF gemacht habe wurde kein Speicher freigegeben und beim nächsten Objekt wird neuer Speicher belegt.
Das Ergebnis ist ein Programm das Speicher frisst, bis es beendet wird.

Also einfach die DLL nicht entladen, das wird automatisch vom OS erledigt sobald die EXE beendet wird.

Der "internal Error" tritt bei mir auch auf, wenn ich mit einem ungültigen handle auf eine DLL zugreifen will.
Wenn der Xbase++ code beiliegt kann man da ja nachbessern.

Bei der LibXL habe ich z.B. eine interne Variable mitgeführt, die verhindert, dass mehr als einmal der interne Speicher freigegeben wird (beim zweiten Aufruf => interne Datenstrukturen beschädigt ...
Auf Pablos Rat hin habe ich auch die numerische iVar (::nDLL) gegen den DLL-Namen ausgetauscht, dieser ist immer gültig :!:

also statt ::nDLL einfach 'LibXL' angeben.

Wie gesagt, wenn Ihr den Quellcode der Xbase++ Klasse habt, könnt Ihr die Mängel ausgleichen.
Gruß
Hubert

Benutzeravatar
andreas
Foren-Moderator
Foren-Moderator
Beiträge: 1638
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Kontaktdaten:

Re: Thread und Frax

Beitrag von andreas » So, 15. Dez 2013 9:24

Hallo Werner,

ich hatte FRAX mit einem Dienst benutzt, der nur mit Threads gearbeitet hat. Einer der Threads hat zur bestimmten Zeit die Reports als PDF gespeichert und per Email versendet. Ich hatte nice PRobleme damit, dass Frax in Thread benutzt wurde.
Allerdings war das der einzige Thread, der Frax benutzt hat.
Gruß,

Andreas
VIP der XUG Osnabrück
Beisitzer des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Werner_Bayern
Programmier-Gott
Programmier-Gott
Beiträge: 1288
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: Thread und Frax

Beitrag von Werner_Bayern » So, 15. Dez 2013 21:41

Servus Andreas,

Du hast also auch nie die Konstellation, dass ein Thread ein oFrax:destroy() aufruft, während ein zweiter Frax-Thread läuft?

Wieso schreibst Du in der Vergangenheit, setzt Du Frax nicht mehr ein?
es grüßt euch

Werner

Benutzeravatar
andreas
Foren-Moderator
Foren-Moderator
Beiträge: 1638
Registriert: Mi, 28. Sep 2005 10:53
Wohnort: Osnabrück
Kontaktdaten:

Re: Thread und Frax

Beitrag von andreas » Mi, 18. Dez 2013 16:25

Hallo Werner,

die erwähnte Anwendung ist bei meinem alten Arbeitgeber geblieben.
Gruß,

Andreas
VIP der XUG Osnabrück
Beisitzer des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Werner_Bayern
Programmier-Gott
Programmier-Gott
Beiträge: 1288
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: Thread und Frax

Beitrag von Werner_Bayern » Mi, 18. Dez 2013 17:37

Servus Andreas,

danke für die Info. Du arbeitest also weiterhin mit Frax? Hat jemand schon die Kompatibilität mit Xbase++ 2.0 getestet?
es grüßt euch

Werner

Antworten