Fehlerrückgabe von eigenen Funktionen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Fehlerrückgabe von eigenen Funktionen

Beitrag von CSHW89 »

Hi leute,
also ich suche eine gute möglichkeit dem benutzer einiger meiner funktionen zu signalisieren, falls in einer dieser funktionen ein fehler aufgetreten ist.
bisher hatte ich eine funktion "GetErrorText", die den fehler zurückgibt. ungefär so:

Code: Alles auswählen

MachWas()
text.s = GetErrorText()
If (text <> "")
  Debug "In 'MachWas' gab es ein Fehler: " + text
EndIf
so das funktioniert nun nicht mehr, da ich möchte, dass man die funktion "MachWas" mehrmals gleichzeitig aufrufen kann (threads). es kann ja dann sein das zwei fehler gleichzeitig passieren, und "GetErrorText()" weiß dann nicht, welcher fehler zurückgegeben werden muss.

so nun zur frage: hat jemand ne idee wie ich das machen kann? ein anderes fehlersystem?
oder wie ich in diesem thread schon gefragt hab http://www.purebasic.fr/german/viewtopi ... =3&t=23154 , wie man Threaded in einer lib/dll benutzen kann?

ich hoffe das war verständlich
bitte um ideen. danke schon mal

lg kevin
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Fehlerrückgabe von eigenen Funktionen

Beitrag von STARGÅTE »

Ich würde es mit einer Mutex geschützten Liste machen, in der von überall (Threads) Fehler eingetragen werden.
Eine Weitere Sammlung an Funktionen, welche Mutex-Geschützt ist, ermöglicht dann, das ganze auslesen:

Code: Alles auswählen

Global ErrorMutex = CreateMutex()
Global NewList Error.s()

Procedure AddError(Text.s)
  LockMutex(ErrorMutex)
    LastElement(Error())
    AddElement(Error()) : Error() = Text
  UnlockMutex(ErrorMutex)
EndProcedure

Procedure Test(Thread)
  Repeat
    x = Random(100)
    If x = 0
      AddError("Fehler in Thread "+Str(Thread))
    EndIf
    Delay(Random(10)+5)
  ForEver
EndProcedure

Procedure ExamineErrors()
  LockMutex(ErrorMutex)
    ResetList(Error())
EndProcedure

Procedure NextError()
    ProcedureReturn NextElement(Error())
EndProcedure

Procedure FinishErrors()
    ClearList(Error())
  UnlockMutex(ErrorMutex)
EndProcedure


For n = 1 To 10
 CreateThread(@Test(), n)
Next

Repeat

  Delay(1000)
  ExamineErrors()
  While NextError()
    Debug Error()
  Wend
  FinishErrors()

ForEver
Wie man sieht, erstellen die Threads Fehler, und im Main liest man sie aus.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: Fehlerrückgabe von eigenen Funktionen

Beitrag von CSHW89 »

danke schon mal, funktioniert prima.
da ich das mit der thread-sache aber eh nur als bonus ansehe, also die meisten benutzer die funktionen meiner lib nicht mit threads benutzen, ist mir das noch ein wenig zu kompliziert:

Code: Alles auswählen

MachWas()
ExamineErrors()
While NextError()
  Debug Error()
Wend
FinishErrors()
... bei jeder funktion wäre ein wenig overhead, wie gesagt, wenn keine threads benutzt werden.

deshalb hoffe ich ja immer noch, das sich jemand findet, der weiß, wie dieses blöde 'Threaded' mit DLL's funktioniert.

aber, wie gesagt, danke dir :allright:

lg kevin
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Antworten