Gateway_man Geschrieben 22. Oktober 2009 Geschrieben 22. Oktober 2009 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. Zitieren
EckY Geschrieben 22. Oktober 2009 Geschrieben 22. Oktober 2009 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? Zitieren
Gateway_man Geschrieben 22. Oktober 2009 Autor Geschrieben 22. Oktober 2009 Jep Delegate alias funktionszeiger. Zitieren
HJST1979 Geschrieben 23. Oktober 2009 Geschrieben 23. Oktober 2009 Das ist aber auch mit ca 3 Zeilen code umgangen 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 Zitieren
Gateway_man Geschrieben 23. Oktober 2009 Autor Geschrieben 23. Oktober 2009 (bearbeitet) 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 23. Oktober 2009 von Gateway_man Zitieren
0815FIA Geschrieben 23. Oktober 2009 Geschrieben 23. Oktober 2009 Anonyme Delegaten sind beim sortieren von Listen etc sehr nützlich. exList.Sort(delegate(int i1, int i2) {return i1.CompareTo(i2);}); Zitieren
Empfohlene Beiträge
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.