Zum Inhalt springen

Erklärungsbedarf bezüglich Nachteile von Threads


Gateway_man

Empfohlene Beiträge

hi leute,

ich bin letztens mal wieder auf das Thema Threads sowie Zeiger gestoßen.

Mein Chef meint ja immer ich soll die finger davon lassen da diese keine gute Lösung sind.

Aber im privaten Bereich arbeite ich fast ausschließlich nur noch mit threads und funktionszeigern und habe jetzt eingentlich noch keine großen nachteile feststellen können, außer das der code irgendwann etwas komplexer wird wenn man mehrere threads parallel verwendet.

Ich finde diese auch wesentlich praktischer als beispielsweise Timer die ich (aus unerfindlichen gründen) nicht wirklich gerne benutze.

Das einzige was meines erachtens etwas störend ist, das ich nicht direkt auf controls zugreifen, was aber natürlich verständlich ist, die haben ja jeweils ihre eigenen threads....

Das ist aber auch mit ca 3 Zeilen code umgangen also für mich nicht der beweggrund, das es beispielsweise zu aufwändig wäre. (Was mein Chef mir ständig als gegenargument aufzählt).

Was sagt ihr dazu?

Benutzt ihr "gerne" oder öfters Threads oder Zeiger.

LG

Gateway

PS: Ich würde mich freuen wenn ihr mir für mich verständliche Nachteile aufführen könntet.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Bei heutigen Mehrkernprozessoren sind Threads doch durchaus ratsam, wie sonst soll man die volle Kapazität der Rechner nutzen.

Threads sind nur schwieriger wenn man den Zugriff auf Resourcen kontrollieren muss, dass diese nicht von mehreren Threads gleichzeitig verwendet werden (siehe Semaphoren).

Meinst du mit Zeigern Delegaten?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Kannst du diese 3 Zeilen (oder auch mer) mal hierher schreiben, habe mich noch nicht so sehr mit Threads beschäftigt ist aber für mich schon ein interessantes Thema.

Gruß Hans-Jörg

Kein Problem ich schreib hier mal ein kleines beispiels rein (allerdings vb.net):

Bei diesem beispiel wir erläutert wie man werte welche in einem thread ermittelt werden für ein control verwenden kann.


'Public definierte Variablen:

'deklaration des funktionszeiger:

    Delegate Sub changevalue(ByVal percent As Integer, ByVal zahl As String, ByVal state As String)

'deklarieren des threads:

public thr1 As New Threading.Thread(AddressOf step1)


    Private Sub form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown

        thr1.Start()

'Der Thread wir gestartet und somit wird der Code aus der Prozedur Step1 ausgeführt.

    End Sub


'step1 ist in diesem fall die prozedur die der in dem thread1 ausgeführt wird

    Public Sub step1()


        Dim prefetch As New changevalue(AddressOf chval)

'prefetch ist eine variable die als variablentyp den von mir erstellten funktionszeiger innehält.

'Nebeibei wird wie man sieht die adresse der Prozedur des Delegates übergeben. Man muss darauf achten das die übergabeparameter der Prozedur exakt die gleichen datentypen haben wie das zuvor deklarierte delegate.


        If check1 = True Then

            Dim cmd As New SqlServerCe.SqlCeCommand

            cmd.Connection = con

            cmd.CommandText = "SELECT * FROM Kontakte"

            Dim ada As New SqlServerCe.SqlCeDataAdapter(cmd)

            Dim dt As New DataTable

            ada.Fill(dt)

            dt.Columns.Remove("ID")

            For i As Integer = 0 To dt.Rows.Count - 1

                Dim ges As Integer = dt.Rows.Count

                Dim percent As Short = (i / ges) * 100

                Dim state As String = "Kopieren der Kontakte"

                Dim current As String = i & " von " & dt.Rows.Count & " Kontakten!"

                Me.Invoke(prefetch, percent, current, state)

'per Invoke wird der funktionszeiger aufgerufen mit den zuvor bestimmten übergabeparametern


                Dim Firma As String = dt.Rows(i)("Firma").ToString

                Dim Anrede As String = dt.Rows(i)("Anrede").ToString

                Dim Vorname As String = dt.Rows(i)("Vorname").ToString

                Dim Nachname As String = dt.Rows(i)("Nachname").ToString

                Dim Straße As String = dt.Rows(i)("Straße").ToString

                Dim PLZ As String = dt.Rows(i)("PLZ").ToString

                Dim Ort As String = dt.Rows(i)("Ort").ToString

                Dim mail As String = dt.Rows(i)("E-mail").ToString

                Dim handy As String = dt.Rows(i)("Handynummer").ToString

                Dim fest As String = dt.Rows(i)("Festnetznummer").ToString

                Dim cmd2 As New SqlServerCe.SqlCeCommand

                cmd2.Connection = con2

                cmd2.CommandText = "SELECT * FROM Kontakte WHERE Vorname like '" & Vorname & "' And Nachname like '" & Nachname & "'"

                Dim ada2 As New SqlServerCe.SqlCeDataAdapter(cmd2)

                Dim dt2 As New DataTable

                ada2.Fill(dt2)

                If dt2.Rows.Count > 0 Then

                Else

                    Dim insert As New SqlServerCe.SqlCeCommand

                    insert.Connection = con2

                    insert.CommandText = "INSERT INTO Kontakte(Firma, Anrede, Vorname, Nachname, Straße, PLZ, Ort, [E-mail], Handynummer, Festnetznummer) Values" _

                    & "('" & Firma & "', '" & Anrede & "', '" & Vorname & "', '" & Nachname & "', '" & Straße & "', '" _

                    & PLZ & "', '" & Ort & "', '" & mail & "', '" & handy & "', '" & fest & "')"

                    con2.Open()

                    insert.ExecuteNonQuery()

                    con2.Close()

                End If

            Next

        End If


Public Sub chval(ByVal percent As Integer, ByVal zahl As String, ByVal state As String)

'Dies is die Prozedur auf die das Delegate verweist. Mit den aus dem thread übergebenen Parametern füttere ich nun meine controls

        ProgressBar1.Value = percent

        Label3.Text = state

        Label4.Text = zahl

    End Sub

Kleine Anmerkung die wirklich wichtigen Zeilen des Codes um von Threads auf controls zuzugreifen werde ich hier noch einmal schnell zusammenfassen:

'Die deklaration des Funktionszeigers:

  Delegate Sub changevalue(ByVal percent As Integer, ByVal zahl As String, ByVal state As String)

'Die Deklaration einer Variable mit dem Typennamen meines Delegates.

'Deklariert wird die variable innerhalb des Threads.

Dim prefetch As New changevalue(AddressOf chval)


'Der Aufruf des Delegates mit den zuvor bestimmten übergabeparametern:


 Me.Invoke(prefetch, percent, current, state)


Lg

Gateway

Bearbeitet von Gateway_man
Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...