Thread in dem eine Form läuft bekommen

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von Sirati.

    Thread in dem eine Form läuft bekommen

    Hallo Leute
    ich würde gerne den thread bekommen in dem einen unbstimmt form lauft.
    Eine möglichkeit kenn ich schon namlich:

    VB.NET-Quellcode

    1. Dim t As Thread = DirectCast(x.Invoke(Function() As Thread
    2. Return Thread.CurrentThread
    3. End Function), Thread)

    aber das erzeugt ja ein großen deathlock risiko
    kenn jemand eine andere mäglichkein die keine großen nachteile hat wie diese???

    Euer Sirati97

    Ps:Langsame geschwindigkeit ist natürlich auch ein nachteil genauso wie die auslastung eines prozessorkerns um mehr als 0,2%
    Deadlock
    wenn ich den thread erhalten will heißt das ich mache das wohl aus nem anderen thread.
    sonst konnte ich ja sofort das hier machen:

    VB.NET-Quellcode

    1. Dim t As Thread = Thread.CurrentThread

    solte der aber gerade auf meinen thread warten der durch invoke auf diesen wartet kommt es zu einem deathlock.
    also nichts mehr geht da beide auf sich warten
    Ja das Problem hast du natürlich. Du wirst es aber über sowas machen müssen. Du kannst natürlich sofort beim erstellen der StartForm,... den Thread schon irgendwo als Eigenschaft zugänglich machen. Aber du wirst es über CurrentThread machen müssen.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Ja?
    Die form speichert doch auch den thread un dem sie gestatet worden ist um illigale zugriffe zu überprüfen oder bin ich falscher ansicht???
    @Blaze
    sie soll verhindern das von einem plugin auf ein andere Form des haubtprogrammes zuzugreifen(abgenommen von einer gewollten sache die einzige möglivhkeit noch aufs haubtprogramm zuzugreifen)
    Die Form macht das, damit die Abfolge der Windows Messages gleich bleibt. Eine (Windows-)Gui-Anwendung basiert auf einer Nachrichtenschleife, bei der eingehende Nachrichten in der Reihenfolge der Einreihung ausgeführt werden (Queue-artig, also FIFO). Damit wird sichergestellt, dass zum Beispiel die Änderung von einer Hintergrundfarbe und einem Font in der Reihenfolge der Änderung geupdatet werden und eben diese Cross-Thread-Geschichten nicht möglich sind. Außerdem wird ermöglicht, dass gewisse Messages quasi verschmolzen werden (wird zumindest wahrscheinlich gemacht, wie zum Beispiel bei Invalidate). Außerdem kann so eine Kommunikation ohne die Erzeugung zusätzlicher Threads laufen, da die Nachrichtenschleife immer solange läuft, wie die Form kein WM_CLOSE gesendet bekommt.
    D.h. insgesamt, dass diese Art von Schutz dazu da ist, dass du keinen Mist baust, indem du die Nachrichtenschleife durcheinander bringst. Invoke zum Beispiel sollte eine Nachricht mit einem (quasi) Delegaten einreihen, der aufgerufen wird, sobald die Nachricht bearbeitet wird und es wird solange gewartet, bis der Delegat abgearbeitet wurde. Bei BeginInvoke wird eben nicht gewartet.
    Wie sieht denn dein Plug-In-System überhaupt aus? Bin zwar kein Sicherheitsexperte, aber vielleicht kann man da ja ein paar Empfehlungen geben.

    Gruß
    ~blaze~
    erstmahl das plugin leuft kommplet abgelapstelt!
    das heißt auch eine neue meldungsschleifte.
    ich bin doch nicht blöd!
    Schon mal dran gedacht, dass man über zum Beispiel StackTrace oder Reflection an extrem viel Information kommen könnte? Die Form könnte man vielleicht sogar per Application.OpenForms ermitteln. Nachrichtenschlangen sind nicht dazu gedacht, das Sicherheitssystem zu verbessern, du kannst sie aber bei richtiger Konstruktion ggf. sogar so verwenden.

    Gruß
    ~blaze~
    das habe ich auch alles erkant mein lieber und ich ver suche gerde letzderes zu schließen.
    Ja ich meine Openforms.
    Ersteres es ist föllig abgekapselt da du keinen zugriff auf eine einzige class des hauptprogramm hast ist das wohl schwer möglich nich???
    über eine class die das plugin ladt und es dann inruflässt
    oben habe ich eine ausnahme erwähnt über die Es komonizieren kann.(String)
    und eigendlich muss das dich nicht interesieren
    so ich habe mich jetzt hier nen bischen geschritten aber meine frage ist net beantwortet!
    Leider ;(
    Nun, also ich weiß ja dass der liebe @~blaze~ nicht der hellste ist :D Aber er wollte dir nur helfen und leider hatte er völlig Recht, auch wenn du die Kommunikation nur über den String erlaubst, er weiß wie man sich den Zugang trotzdem verschafft(und ich auch), deshalb wollte er Wissen, wie du das Problem gelöst haben wolltest, damit er dir anschließend sagen können hätte, dass das Problem eben nicht gelöst war. Solltest du tatsächlich geschafft haben Reflection zu verhindern, dann gibt es immernoch genügend Möglichkeiten alles mögliche zu manipulieren, die man einfach nicht verhindern kann.
    Da du der jenige bist, der Hilfe will, dann solltest du auch preisgeben, bei was du hilfe willst und dazu muss man auch spezifizieren, wenn es denn von Nöten ist.

    So wie ich mir das vorstelle wirst du es auf diesem Wege, wie du es vorhast sowieso nicht lösen können, da musst du denke ich andere wege gehen.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    ich weiß wie das über reflection geht.
    aber der string wird über nen application stream übergeben und auserdem schätzte ich blaze.
    andere sache wenn du immer noch ne möglichkeit wenn würdest ich in ohr!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Sirati“ ()

    ich habes jetzt so gemacht:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Windows.Forms
    3. Imports System.Threading
    4. Namespace Background.GetThreadbyFormExtension
    5. Module GetThreadbyFormExtension
    6. Private locMutex As New Threading.Mutex
    7. <System.Runtime.CompilerServices.Extension()>
    8. Public Function getThread(ByVal Form As Form) As Thread
    9. locMutex.WaitOne()
    10. Try
    11. Dim Manager = MYMANAGER.GetInstance
    12. If Not Manager.myDictionary.ContainsKey(Form) Then
    13. Manager.myDictionary.Add(Form, New FormInfo(Form))
    14. End If
    15. If Manager.myDictionary(Form).isFinish = False Then
    16. Return Nothing
    17. End If
    18. Return Manager.myDictionary(Form).GetThread
    19. Finally
    20. locMutex.ReleaseMutex()
    21. End Try
    22. End Function
    23. Private Class MYMANAGER
    24. Private Shared locSingleton As MYMANAGER
    25. Private Shared locMutex As New Threading.Mutex
    26. Private Sub New()
    27. End Sub
    28. Friend Shared Function GetInstance() As MYMANAGER
    29. locMutex.WaitOne()
    30. Try
    31. If locSingleton Is Nothing Then
    32. locSingleton = New MYMANAGER
    33. End If
    34. Finally
    35. locMutex.ReleaseMutex()
    36. End Try
    37. Return locSingleton
    38. End Function
    39. Public myDictionary As New Dictionary(Of Form, FormInfo)
    40. End Class
    41. Private Class FormInfo
    42. Public Sub New(Form As Form)
    43. Dim d As Action = Sub()
    44. mythread = Thread.CurrentThread
    45. myisFinish = True
    46. End Sub
    47. If Form.InvokeRequired Then
    48. Form.BeginInvoke(d)
    49. Else
    50. d()
    51. End If
    52. End Sub
    53. Dim mythread As Thread
    54. Dim myisFinish As Boolean
    55. Public ReadOnly Property GetThread As Thread
    56. Get
    57. Return mythread
    58. End Get
    59. End Property
    60. Public ReadOnly Property isFinish As Boolean
    61. Get
    62. Return myisFinish
    63. End Get
    64. End Property
    65. End Class
    66. End Module
    67. End Namespace