tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von Shakie
ERLEDIGT
JA
ANTWORTEN
11
ZUGRIFFE
766
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    cookyman cookyman ist offline Rookie
    Registriert seit
    Sep 2011
    Beiträge
    9
    Hallo Community,

    ich bin langsam am verzweifeln.

    Ich habe in einem Modul ein Thread am laufen,
    weil ich von jeder Form auf diesen Thread zugreifen möchte,
    weil mir dort Mein Server auch mal Nachrichten schickt,
    die dann beim Client auch angezeigt werden soll.

    Hier erstmals mein Code:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    
    Imports System.Net.Sockets
    Imports System.IO
    Module verbindung_herstellen
        Private stream As NetworkStream
        Private streamw As StreamWriter
        Private streamr As StreamReader
        Private client As New TcpClient
        Private server_mail As New Threading.Thread(AddressOf server_listen)
     
        Dim IP As String = "**************"
        Dim Port As Integer = ************
     
        Public Function verbinden()
            Try
                client.Connect(IP, Port)
                If client.Connected Then
                    stream = client.GetStream
                    streamw = New StreamWriter(stream)
                    streamr = New StreamReader(stream)
                    client_send(HDWID)
                    Register = streamr.ReadLine()
                    server_mail.Start()
                    Return ("yes")
                Else
                    Return ("no")
                End If
            Catch
                Return ("no")
                client.Close()
            End Try
        End Function
     
        Sub client_send(ByVal text As String)
            streamw.WriteLine(text)
            streamw.Flush()
        End Sub
        Private Sub server_listen()
            While client.Connected
                Dim auswährten() As String = Split(streamr.ReadLine(), ";")
                If auswährten(0) = "server_send" Then
                    MsgBox(auswährten(1))
                ElseIf auswährten(0) = "register_ok" Then
                    MsgBox(auswährten(1))
                    
     
     
     
                    ' hier möchte ich, das er mir meine Login Form öffnet
                      und die Register Form schließt.
     
     
     
     
                ElseIf auswährten(0) = "userabfrage" Then
                    MsgBox(auswährten(1))
                ElseIf auswährten(0) = "regabfrage2" Then
                    MsgBox(auswährten(1))
                ElseIf auswährten(0) = "Registrier Fehler" Then
                    MsgBox(auswährten(1))
                    client_send("logout")
                ElseIf auswährten(0) = "logout_ok" Then
                    client.Close()
                    stream.Close()
                    streamw.Close()
                    streamr.Close()
                    server_mail.Abort()
                    server_mail.DisableComObjectEagerCleanup()
                    Application.Exit()
                End If
            End While
        End Sub
    End Module


    Meine versuche mit login.show() waren leider Ergebnis los,
    da sich dann die Form aufhängt.

    Ich habe auch schon Google bemüht,
    und raus gefunden das es dafür Delegaten gibt,
    ich habe es damit auch versucht,
    nur leider komme ich mit denn delegaten noch nicht zurecht.

    Ich sitze jetzt seit Sonntag an diesem Problem und komme auf keine Lösung,
    ich hoffe ihr könnt mir helfen,
    da ich sonst mein Projekt nicht weiter machen kann.

    Bitte helft mir dabei.
     

  2. #2
    Avatar von Nico Graichen
    Nico Graichen Nico Graichen ist offline aka gemballa
    tutorials.de Moderator
    Registriert seit
    Dec 2003
    Ort
    Pulheim (NRW)
    Beiträge
    3.898
    Blog-Einträge
    34
    Hi

    Du musst wieder zurück in den UI-Thread, dies ist mit Delegates zu bewerkstelligen. Da warst du also auf der richtigen Spur
    Wo hast du denn damit Probleme?
    Würde dir dafür empfehlen, wenn du damit keine Erfahrungen hast, erstmal eine kleine TestApp zu erstellen, mit der du rumprobieren kannst, wie Cross-Thread-Kommunikation aufzubauen ist.
     
    Grüße Nico
    ----------------------
    Xing
    ----------------------
    Zitat Zitat von Mark Twain (1835-1910)
    Es gibt drei Dinge, die eine Frau aus dem Nichts hervorzaubern kann: einen Hut, einen Salat und einen Ehekrach.
    Zitat Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
    The Difference Between God and Larry Ellison: God Doesn't Think He's Larry Ellison

  3. #3
    cookyman cookyman ist offline Rookie
    Registriert seit
    Sep 2011
    Beiträge
    9
    Hallo,

    ich habe mir im Internet bereits darüber schon einiges angeschaut und habe mir dann folgendes zusammen geschustert Test weiße.

    Code :
    1
    
    Private Delegate Sub d_showSomeFrm()


    Das habe ich im gleichen modul gepackt gehabt am ende:
    Code :
    1
    2
    3
    4
    
    Private Sub Test()
    login.Show()
    reg.Close()
    End Sub

    Und damit wollte ich das aufrufen:
    Code :
    1
    
    Me.Invoke(New d_showSomeFrm(AddressOf Test))

    Und da habe ich dann das Problem,
    das er im Modul beim Aufruf Me. leider nicht erlaubt.

    Darauf hin habe ich dann das Private Sub in die register Form gepackt und wollte sie dann damit aufrufen :

    Code :
    1
    
    reg.Invoke(New d_showSomeFrm(AddressOf reg.Test))

    Da Kamm dann aber auch wieder ein Fehler,
    genauen Fehler kann ich jetzt gerade nicht sagen,
    da ich los zur Arbeit muss.

    Ich sitze jetzt seit Sonntag an diesem Problem,
    und ohne das ich das behebe kann ich mein Programm leider nicht weiter machen.

    Ich möchte mich schon mal im voraus bedanken bei euch.

    Ich hoffe ihr könnt mir helfen,
    bin echt am verzweifeln damit.
     

  4. #4
    cookyman cookyman ist offline Rookie
    Registriert seit
    Sep 2011
    Beiträge
    9
    Hallo,

    ich habe nun folgendes nochmals versucht:

    im Modul habe ich erstmals das delegate deklariert:

    Code :
    1
    
    Public Delegate Sub mydel()

    dann habe ich im Thread wo ich die Form aufrufen möchte folgendes gemacht:

    Code :
    1
    2
    3
    4
    5
    
                    Dim dlg As mydel
     
                    dlg = New mydel(AddressOf Registrieren.Welcome)
     
                    dlg.Invoke()

    Und in der Form Registrieren habe ich eine sub gemacht:

    Code :
    1
    2
    3
    4
    
        Sub Welcome()
            Login.Show()
     
        End Sub

    Er öffnet mir wie immer die Login Form,
    aber dann bleibt wieder mal das ganze Programm hängen.

    Ich habe jetzt mehrere versuche durch,
    bitte helft mir.

    Ich weiß nicht wo mein Fehler dort liegt,
    ich habe noch nicht mit delegaten gearbeitet und lerne auch erst .net
    daher bin ich dort noch nicht so wirklich gut drinnen.

    Aber jeder Anfang ist schwer.
     

  5. #5
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    Der Code
    Code vbnet:
    1
    2
    
    dlg = New mydel(AddressOf Registrieren.Welcome) 
    dlg.Invoke()
    ist gleichwertig zum direkten Aufrufen der Welcome-Methode:
    Code vbnet:
    1
    
    Registrieren.Welcome()
    Du hast hier den Thread aber noch nicht gewechselt. Was du brauchst ist eine Referenz auf den UI-Thread, zum Beispiel eine Referenz zu einer bereits existierenden Form.
    Dann rufst du die Invoke-Methode dieser existierenden Form auf. Als Parameter übergibst du ein Delegate, welcher seinerseits auf die Welcome-Methode verweist. Somit stellst du sicher, dass der UI-Thread die Welcome-Methode ausführt.
    EDIT:
    Folgendes könnte funktionieren (ich habe es nicht getestet, nur so hingeschrieben):
    Code vbnet:
    1
    2
    
    dlg = New mydel(AddressOf Registrieren.Welcome) 
    Application.OpenForms.Item(0).Invoke(dlg)
    Der Code ist nicht Bug-frei, da er annimmt, dass mindestens eine offene Form existiert.
    Siehe auch Application.OpenForms und Item für Erklärungen der obigen Code-Zeile.
    Geändert von Shakie (14.01.12 um 23:37 Uhr)
    cookyman bedankt sich. 
    hihi = -h²

  6. #6
    cookyman cookyman ist offline Rookie
    Registriert seit
    Sep 2011
    Beiträge
    9
    Danke,
    du hast mir sehr geholfen.

    Schade das man sich nicht mehrmals bedanken kann.

    Ich werde mich dann auch damit mal auseinander setzen,
    das ich das dann auch richtig verstehe,
    was das bewirkt und wie man das richtig einsetzt.
     

  7. #7
    cookyman cookyman ist offline Rookie
    Registriert seit
    Sep 2011
    Beiträge
    9
    Sorry das ich das Thema nochmals aufrolle,
    aber ich habe das nun das nächste Problem,
    das mit dem Form Aufruf funktioniert super.

    Nun hänge ich am nächsten Problem,
    wenn ich vom Server eine Meldung erhalte,
    dann möchte ich das sie mir in einer Textbox erscheint und nicht als MessageBox.

    Nun habe ich folgendes versucht:

    Code :
    1
    
    Private Delegate Sub DAddItem(ByVal s As String)

    Code :
    1
    2
    3
    
        Private Sub AddItem(ByVal s As String)
            Textbox1.Text = s
        End Sub

    Der aufruf wie er fast überall zu finden ist:
    Code :
    1
    
     Me.Invoke(New DAddItem(AddressOf AddItem), auswerten(1))


    Da ich das ganze in ein Modul stehen habe,
    da ich auf dem Thread von jeder Form zugreifen möchte funktioniert das me ja leider nicht,
    ich hoffe ihr könnt mir sagen was daran wieder falsch ist.
     

  8. #8
    cookyman cookyman ist offline Rookie
    Registriert seit
    Sep 2011
    Beiträge
    9
    Hallo,
    das Problem hat sich doch dann von selbst erledigt.

    Hallo,

    ich habe nun ein ganz anderes Problem,
    und zwar wenn ich einen Text vom Server an alle sende die verbunden sind,
    dann übernimmt er mir die Zeilenumbrüche nicht,
    zumindest kommen diese beim Client nicht an.

    Zum Beispiel könnte der Text so aussehen:

    Test

    test2

    test3

    Dann kommt beim Client nur das Test an,
    der Rest ist einfach weg.

    Mein Aufruf :

    Code :
    1
    
    SendToAllClients("server_send;" & RichTextBox1.Text)

    und hier die sub dazu:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
        Private Sub SendToAllClients(ByVal s As String)
            For Each c As Connection In list
                Try
                    c.streamw.WriteLine(s)
                    c.streamw.Flush()
                Catch
                End Try
            Next
        End Sub

    Die Ausgabe beim Client habe ich mit einer Textbox, richtextbox und auch Messagebox versucht, aber es kommt nur die erste Zeile beim Client an.

    Kann mir jemand sagen woran das liegt ?
    Geändert von sheel (18.01.12 um 09:07 Uhr) Grund: Doppel
     

  9. #9
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    Was ist Conncection für eine Klasse? Schau dir mal die Dokumentation der WriteLine-Methode an, die du verwendest. Darin wird bestimmt erklärt, warum nur die erste Zeile gesendet wird.
    Geändert von Shakie (18.01.12 um 05:45 Uhr)
     
    hihi = -h²

  10. #10
    cookyman cookyman ist offline Rookie
    Registriert seit
    Sep 2011
    Beiträge
    9
    Das ist die Methode:


    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
        Private list As New List(Of Connection)
     
     
        Private Structure Connection
            Dim stream As NetworkStream
            Dim streamw As StreamWriter
            Dim streamr As StreamReader
            Dim user_pc_daten As String
            Dim user_name As String
        End Structure
     

  11. #11
    cookyman cookyman ist offline Rookie
    Registriert seit
    Sep 2011
    Beiträge
    9
    Hallo,

    ich habe es nun doch selber hin bekommen,
    ich wünsche euch allen noch einen schönen Abend.
     

  12. #12
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    Bitte schreibe doch was die Lösung ist, damit andere, die das selbe Problem haben (werden) hier die Lösung finden!
    (BTW: Connection nennt sich in deinem Fall nicht Methode, sondern Struktur.)
     
    hihi = -h²

Ähnliche Themen

  1. Daten von Form zum Thread übergeben
    Von july im Forum .NET Application und Service Design
    Antworten: 1
    Letzter Beitrag: 13.12.11, 17:46
  2. Dokumente mit Office 2003 öffnen anstatt 2010
    Von Dolphon im Forum Microsoft Windows
    Antworten: 5
    Letzter Beitrag: 07.12.10, 11:55
  3. Antworten: 10
    Letzter Beitrag: 17.07.10, 14:28
  4. Antworten: 1
    Letzter Beitrag: 18.09.08, 22:35
  5. neues Form in Thread starten
    Von hagbard_celine im Forum .NET Windows Forms
    Antworten: 4
    Letzter Beitrag: 25.09.06, 13:43