Seite 1 von 1

Fehlerrückgabe von eigenen Funktionen

Verfasst: 31.10.2010 20:08
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

Re: Fehlerrückgabe von eigenen Funktionen

Verfasst: 31.10.2010 20:56
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.

Re: Fehlerrückgabe von eigenen Funktionen

Verfasst: 31.10.2010 21:15
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