Aktuelle Zeit: 23.09.2018 04:51

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags: Re: SimplePBLogger
BeitragVerfasst: 31.08.2018 23:56 
Offline
Benutzeravatar

Registriert: 19.07.2018 20:41
So, ich hab jetzt alle Vorschläge eingearbeitet (siehe erster Post). Vielen Dank für eure Hilfe! Mit dem Mutex hatte ich mir zwischendurch auch nochmal selber angesehen und mit ihm vorsichtshalber auch noch alle anderen Dateioperationen gewrappt (z.B. ExamineDirectory). Ist das sinnvoll oder programmiertechnisch ein wildes UmSichSchlagen? :lol:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: SimplePBLogger
BeitragVerfasst: 02.09.2018 12:46 
Offline
Benutzeravatar

Registriert: 11.08.2005 19:08
Qnode hat geschrieben:
Mit dem Mutex [...] vorsichtshalber auch noch alle anderen Dateioperationen gewrappt (z.B. ExamineDirectory). Ist das sinnvoll oder programmiertechnisch ein wildes UmSichSchlagen? :lol:
Aktuell macht es Sinn, weil du für die Datei- und Verzeichnisoperationen feste ID-Nummern verwendest und jeder Thread sich beim anderem Thread in den Prozess einmischen würde. Lösen könntest du das Problem mit #PB_Any. Mit dieser Konstante generiert PB immer eine neue ID-Nummer.

Einige deiner Procedures verwendet die globale Liste CurrentLogFiles(), weshalb sie per einem Mutex geschützt werden müssen. In diesem Fall bringt dir das oben erwähnte Umstellen auf #PB_Any also nichts.

Ich versuche mal die Problematik mit Threads zu veranschaulichen, damit du es besser verstehen kannst.
Führe folgenden Code mit gesetzter Compiler-Option "Thread-sicheres Executable" aus:
Code:
Global NewList Values()
Global StopThreads

Define Thread1, Thread2

AddElement(Values()) : Values() = 1
AddElement(Values()) : Values() = 2

Procedure PrintListContent(ThreadNumber)
  Repeat
    ForEach Values()
      Debug "Thread " + Str(ThreadNumber) + ": " + Str(Values())
    Next
  Until StopThreads
EndProcedure

Thread1 = CreateThread(@PrintListContent(), 1)
Thread2 = CreateThread(@PrintListContent(), 2)

Delay(1) ; ca. 1 Millisekunde warten

StopThreads = #True

WaitThread(Thread1)
WaitThread(Thread2)

End
Ein Ausschnitt meiner Debug-Ausgabe:
Code:
Thread 2: 1
Thread 1: 1
Thread 1: 1 <= 1 anstatt 2
Thread 1: 2 <= Jetzt kommt plötzlich die zuvor erwartete 2
Thread 2: 2
Thread 1: 1
Thread 2: 2 <= Thread-2, wo ist die 1?
Wie du sehen kannst, kommt der Prozess ziemlich durcheinander, wenn zwei Threads auf die gleiche Ressource (hier die Liste) zugreifen.

Mit einem Mutex kannst du wieder für Ordnung sorgen:
Code:
Global Mutex = CreateMutex()

Procedure PrintListContent(ThreadNumber)
  Repeat
    LockMutex(Mutex)
    ForEach Values()
      Debug "Thread " + Str(ThreadNumber) + ": " + Str(Values())
    Next
    UnlockMutex(Mutex)
  Until StopThreads
EndProcedure
Code:
Thread 1: 1
Thread 1: 2
Thread 1: 1
Thread 1: 2
Thread 2: 1
Thread 2: 2


Qnode hat geschrieben:
; + Copyright: this is freeware
Zitat:
Die Programmierer verzichten bei Freeware nur auf eine Nutzungsvergütung, aber nicht auf das Urheberrecht. Den Benutzern wird nur ein Nutzungsrecht eingeräumt; Änderungen der Software oder die Nutzung der Teile des Programms (wie etwa Codeschnipsel) werden untersagt. Freewareprogramme können frei kopiert und weitergegeben werden.
Quelle: https://de.wikipedia.org/wiki/Freeware

Stimmt das mit deiner Absicht überein?

_________________
Bild
Warum OpenSource eine Lizenz haben sollte
PureBasic-CodeArchiv-Rebirth: Git-Repository / Download -- Jede Hilfe ist willkommen!
Manjaro Xfce x64 (Hauptsystem) :: WindowsXP/Xubuntu x86 (VirtualBox) :: PureBasic (Linux: x86/x64, Windows: x86) :: jeweils neueste Version


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: SimplePBLogger
BeitragVerfasst: 02.09.2018 17:10 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
Ich denke das die Values eher zum Prozess (Thread) gehören und dort auch zugewiesen werden.

Früher wusste ich mit "Threaded" nichts anzufangen, verwende es aber immer öfters...
Code:
;-TOP

CompilerIf #PB_Compiler_Thread = 0
  CompilerError "Stop - Use Compiler-Options Threadsafe!"
CompilerEndIf


Threaded NewList Values()
Global StopThreads

Define Thread1, Thread2

AddElement(Values()) : Values() = 1
AddElement(Values()) : Values() = 2

Procedure PrintListContent(ThreadNumber)
 
  AddElement(Values()) : Values() = ThreadNumber * 100 + 1
  AddElement(Values()) : Values() = ThreadNumber * 100 + 2
 
  Repeat
    ForEach Values()
      Debug "Thread " + Str(ThreadNumber) + ": " + Str(Values())
    Next
  Until StopThreads
EndProcedure

Thread1 = CreateThread(@PrintListContent(), 1)
Thread2 = CreateThread(@PrintListContent(), 2)

Delay(2) ; ca. 1 Millisekunde warten

StopThreads = #True

WaitThread(Thread1)
WaitThread(Thread2)

End

_________________
Alles ist möglich, fragt sich nur wie...
Projekte EventDesigner v1.x / OOP-BaseClass-Modul / OPC-Helper DLL
PB v3.30 / v5.4x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf Webspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: SimplePBLogger
BeitragVerfasst: 02.09.2018 19:09 
Offline
Benutzeravatar

Registriert: 19.07.2018 20:41
Hey,

vielen Dank für die Erklärungen zu den Threads und den Beispielcode. Ich denke, ich habe es verstanden und belasse es dann auch dabei, die Verzeichniszugriffe per Mutex zu schützen. Dann müsste der Logger auch in einer Umgebung mit mehreren Threads vernünftig laufen.

Das mit der Freeware war eher dann nicht so gemeint. Ich wollte eigentlich ausdrücken, dass ich auf die paar Codezeilen keinerlei Ansprüche erhebe und jeder sie verwenden oder ändern kann, wie er möchte. Ich änder das gleich mal im ersten Post in der Hoffnung, dass es dann besser passt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: SimplePBLogger
BeitragVerfasst: 16.09.2018 18:51 
Offline
Benutzeravatar

Registriert: 19.07.2018 20:41
Liebe Leute,

habe Probleme mit dem Einsatz meines eigenen Loggers :bluescreen:

Da ich einen Teil der geloggten Daten dafür immer wieder brauche, habe ich die Zusammenstellung dieser Daten in eine eigene Prozedur ausgelagert. Nun bekomme ich beim Declare dieser Prozedur einen Syntaxfehler. Normalerweise sind solche Fehler selbst für mich schnell gefunden, aber an dem hier beiße ich mir die Zähne aus. Habe die Hilfe zu Prozeduren usw. gecheckt, das hat aber nix gebracht. Könnt ihr mal einen Blick drauf werfen? Habe die wichtigsten Passagen aus dem Code zusammengestellt und hoffe, das ist aussagekräftig genug. Ich wollte euch nicht mit dem ganzen Kram belästigen (der Code zum SimplePBLogger befindet sich im ersten Post zu diesem Thema, falls da jemand nachsehen will).

Code:
; Aus SimplePBLogger.pbi
Structure SPBL_Parameter  ; for optional key/value-entries to write in Logfiles
    Map Entries.s()
  EndStructure

; Hauptprogramm

...

XIncludeFile "SimplePBLogger.pbi"

UseModule SimplePBLogger

...

Declare ErzeugeLogDatenBuchung(Logdaten.SPBL_Parameter)
; FIXME: Die Zeile vor mir erzeugt einen Syntaxfehler und ich weiß nicht warum!

...

Procedure ErzeugeLogDatenBuchung(Daten.SPBL_Parameter)
  Daten\Entries("ID") = Str(ListeBuchungen()\ID)
  Daten\Entries("Name") = ListeBuchungen()\Name
  If ListeBuchungen()\Buchungsart = #MFK_BUCHUNGSART_AUSGABE
    Daten\Entries("Buchungsart") = "Ausgabe"
  Else
    Daten\Entries("Buchungsart") = "Einnahme"
  EndIf
  Daten\Entries("Kategorie") = ListeBuchungen()\Kategorie
  Daten\Entries("Zahlungsart") = Zahlungsart(ListeBuchungen()\Zahlungsart)
  Daten\Entries("Bemerkungen") = ListeBuchungen()\Bemerkungen
  Daten\Entries("Beginn") = DatumZuString(ListeBuchungen()\Beginn)
  Daten\Entries("Ende") = DatumZuString(ListeBuchungen()\Ende)
EndProcedure


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: SimplePBLogger
BeitragVerfasst: 16.09.2018 19:03 
Offline
Benutzeravatar

Registriert: 20.04.2006 09:50
Pointer verwenden, also ein Asterisk voranstellen
Code:
Procedure ErzeugeLogDatenBuchung(*Daten.SPBL_Parameter)
  *Daten\Entries("ID") = Str(ListeBuchungen()\ID)

_________________
my pb stuff..
Bild..jedenfalls war das mal so.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: SimplePBLogger
BeitragVerfasst: 16.09.2018 19:21 
Offline
Benutzeravatar

Registriert: 19.07.2018 20:41
Danke. Das war es. :D


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite Vorherige  1, 2

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  
cron

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye