Thread und Frax

Moderator: Moderatoren

Thread und Frax

Beitragvon 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
Werner_Bayern
Programmier-Gott
Programmier-Gott
 
Beiträge: 1207
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: Thread und Frax

Beitragvon 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
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13201
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

Re: Thread und Frax

Beitragvon 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
Werner_Bayern
Programmier-Gott
Programmier-Gott
 
Beiträge: 1207
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: Thread und Frax

Beitragvon Koverhage » Do, 05. Dez 2013 16:13

Ich würde vermuten das es hieran liegt
oFrax:ClearDatasets()
Gruß
Klaus
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 1866
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen

Re: Thread und Frax

Beitragvon 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
Werner_Bayern
Programmier-Gott
Programmier-Gott
 
Beiträge: 1207
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: Thread und Frax

Beitragvon 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
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13201
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

Re: Thread und Frax

Beitragvon 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
Werner_Bayern
Programmier-Gott
Programmier-Gott
 
Beiträge: 1207
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: Thread und Frax

Beitragvon 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
Lewi
1000 working lines a day
1000 working lines a day
 
Beiträge: 776
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg

Re: Thread und Frax

Beitragvon 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
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13201
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim

Re: Thread und Frax

Beitragvon 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.
Benutzeravatar
andreas
Foren-Moderator
Foren-Moderator
 
Beiträge: 1561
Registriert: Mi, 28. Sep 2005 9:53
Wohnort: Osnabrück

Re: Thread und Frax

Beitragvon 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
Werner_Bayern
Programmier-Gott
Programmier-Gott
 
Beiträge: 1207
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: Thread und Frax

Beitragvon andreas » Mi, 18. Dez 2013 16:25

Hallo Werner,

die erwähnte Anwendung ist bei meinem alten Arbeitgeber geblieben.
Benutzeravatar
andreas
Foren-Moderator
Foren-Moderator
 
Beiträge: 1561
Registriert: Mi, 28. Sep 2005 9:53
Wohnort: Osnabrück

Re: Thread und Frax

Beitragvon 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
Benutzeravatar
Werner_Bayern
Programmier-Gott
Programmier-Gott
 
Beiträge: 1207
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern


Zurück zu Fast Report / FRAX

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron