Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

thread problem

Îåêßíçóå áðü ôï ìÝëïò kafat. Τελευταία δημοσίευση από το μέλος kafat στις 20-06-2007, 21:48. Υπάρχουν 5 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  16-06-2007, 20:52 32976

    thread problem

    Καλησπέρα.

     

    Προσπαθώ να μάθω πως μπορώ να φτιάξω  μία Server εφαρμογή η οποία θα έχει και γραφικό interface.

     

    Η δοκιμαστική εφαρμογή λοιπόν είναι έτυμη εκτός από μία λεπτομέρεια.

    Έχω ένα Log το οποίο θέλω να εμφανίζετε σε ένα datagridview αλλά μέσα από το thread δεν γράφει στο grid αλλά ούτε βγάζει κάποιο μήνυμα λάθους  ενώ περνάει από το σημείο και τρέχει την εντολή.

     

    παρακάτω ο κώδικας μου


     Option Strict On

    Imports System
    Imports System.IO
    Imports System.Net
    Imports System.Net.Sockets
    Imports System.Threading
    Public Class dpserver
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            WriteToLog("log.txt", "Listening on port " & "9999 kosmas", "Server")
            Dim kos As New startup("k")
            Dim thread2 As New Thread(New ThreadStart(AddressOf kos.run))
            thread2.IsBackground = True
            thread2.Priority = ThreadPriority.Highest
            thread2.Start()
        End Sub
        Class startup
            Private k As String
            Public Sub New(ByVal k2 As String)
                Me.k = k2
            End Sub 'New
            Public Sub run()
                Dim tcplistener As New TcpListener(9999)
                tcplistener.Start()
                While True
                    Dim socket As Socket = tcplistener.AcceptSocket()
                    Dim dpse As New dpse(socket)
                    Dim thread As New Thread(New ThreadStart(AddressOf dpse.run))
                    thread.IsBackground = True
                    thread.Start()
                End While
            End Sub
        End Class
        Class dpse
            Private clientSocket As Socket
            Private read() As [Byte] = New Byte(1023) {}
            Private Buffer As [Byte]() = Nothing
            Private ASCII As Text.Encoding = System.Text.Encoding.ASCII
            Private RecvBytes(4095) As [Byte]
            Const port As Integer = 9999
            Public Sub New(ByVal socket As Socket)
                Me.clientSocket = socket
            End Sub 'New
            Public Sub run()
                Dim clientmessage As String = " "
                Dim sURL As String = " "
                Dim logmsg As String = " "
                Dim bytes As Integer = readmessage(read, clientSocket, clientmessage)
                If bytes = 0 Then
                    Return
                End If
                Dim index1 As Integer = clientmessage.IndexOf(" "c)
                logmsg = clientmessage.Substring(0, 100)
                WriteToLog("log.txt", DirectCast("Client message: " + logmsg, String), "Client")
                WriteToLog("log.txt", "Connection from : " + clientSocket.RemoteEndPoint.ToString(), "Server")
                Try
                    sendmessage(clientSocket, "server :: " + clientmessage)
                    WriteToLog("log.txt", "Message returned : " + "server" + logmsg, "Server")
                Catch exc2 As Exception
                    WriteToLog("log.txt", exc2.ToString, "Server")
                End Try
            End Sub 'run
            Private Function readmessage(ByVal ByteArray() As Byte, ByRef s As Socket, ByRef clientmessage As String) As Integer
                Dim bytes As Integer = s.Receive(ByteArray, 1024, 0)
                Dim messagefromclient As String = System.Text.Encoding.ASCII.GetString(ByteArray)
                clientmessage = CStr(messagefromclient)
                Return bytes
            End Function 'readmessage
            Private Sub sendmessage(ByVal s As Socket, ByVal message As String)
                Buffer = New [Byte](message.Length + 1) {}
                Dim length As Integer = ASCII.GetBytes(message, 0, message.Length, Buffer, 0)
                s.Send(Buffer, length, 0)
            End Sub 'sendmessage
        End Class
    End Class

    Module log
        Public Sub WriteToLog(ByVal Filename As String, ByVal Comment As String, ByVal src As String)
            Dim sw As System.IO.StreamWriter
            Try
                sw = New System.IO.StreamWriter(Filename, True)
                sw.WriteLine(Date.Now & "     " & Comment)
                dpserver.DataGridView1.Rows.Add(Date.Now, Comment)
                'dpserver.mes.Refresh()
            Catch e As Exception
            Finally
                If Not sw Is Nothing Then sw.Close()
            End Try
        End Sub
    End Module




    Και o Client




    Option Strict On

    Imports System
    Imports System.IO
    Imports System.Net
    Imports System.Net.Sockets
    Imports System.Threading
    Public Class Form1
        
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim ctr As Integer = 0
            While ctr < 10
                Label1.Text = ctr.ToString()
                Dim st As New test(TextBox1.Text + ctr.ToString())
                Dim thread2 As New Thread(New ThreadStart(AddressOf st.doit))
                thread2.IsBackground = True
                thread2.Priority = ThreadPriority.Highest
                thread2.Start()
                ctr += 1
            End While
            
        End Sub
        Class test
            Public te As String
            Public Sub New(ByVal text As String)
                te = text
            End Sub
            Public Sub doit()
                Try
                    ' Create a TcpClient.
                    ' Note, for this client to work you need to have a TcpServer
                    ' connected to the same address as specified by the server, port
                    ' combination.
                    Dim port As Int32 = 13000
                    Dim client As New TcpClient("localhost", 9999)

                    ' Translate the passed message into ASCII and store it as a Byte array.
                    Dim data As [Byte]() = System.Text.Encoding.ASCII.GetBytes(te)

                    ' Get a client stream for reading and writing.
                    '  Stream stream = client.GetStream();
                    Dim stream As NetworkStream = client.GetStream()

                    ' Send the message to the connected TcpServer.
                    stream.Write(data, 0, data.Length)

                    Form1.TextBox2.Text += Environment.NewLine + "Sent: " + te + Environment.NewLine
                    Form1.Refresh()
                    ' Receive the TcpServer.response.
                    ' Buffer to store the response bytes.
                    data = New [Byte](256) {}

                    ' String to store the response ASCII representation.
                    Dim responseData As [String] = [String].Empty

                    ' Read the first batch of the TcpServer response bytes.
                    Dim bytes As Int32 = stream.Read(data, 0, data.Length)
                    responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes)
                    Form1.TextBox2.Text += "Received: " + responseData + Environment.NewLine
                    Form1.Refresh()
                    ' Close everything.
                    stream.Close()
                    client.Close()
                Catch ex As ArgumentNullException
                    Form1.TextBox2.Text += "ArgumentNullException: " + ex.Message.ToString() + Environment.NewLine
                    Form1.Refresh()
                Catch ex As SocketException
                    Form1.TextBox2.Text += "ArgumentNullException: " + ex.Message.ToString() + Environment.NewLine
                    Form1.Refresh()
                End Try
            End Sub

        End Class
    End Class







    Ευχαριστώ πολύ

     

    Κοσμάς




  •  16-06-2007, 21:22 32979 σε απάντηση της 32976

    Απ: thread problem

    Είναι μάλλον δύσκολο να καταλάβει κανείς τί συμβαίνει όταν δίνεις 180 γραμμές κώδικα, και απλά ρωτάει "γιατί δεν δουλεύει"? Απ' όσο πρόλαβα να δω εμπλέκονται τουλάχιστον δύο threads, sockets και άλλα πράγματα άσχετα μάλλον με το πρόβλημα σου. Καλύτερα να ξεκινήσεις με ένα καινούριο project το οποίο θα περιέχει μόνο τον κώδικα που σου δημιουργεί πρόβλημα, χωρίς sockets κλπ.

    Πέρα από αυτό, πρέπει να έχεις υπόψη ότι δεν μπορείς από ένα thread να πειράξεις απευθείας τα controls μίας φόρμας. Τα controls της φόρμας έχει δικαίωμα να τα πειράξει μόνο το thread της φόρμας. Δες το "How to: Use a Background Thread to Search for Files" για ένα παράδειγμα πως να καλέσεις τα control μίας φόρμας από ένα background thread. Στο Visual Studio 2005 μάλιστα, αν προσπαθήσεις να καλέσεις απευθείας ένα control από κάποιο background thread θα αρνηθεί να κάνει compile.

    Μία άλλη λύση είναι να χρησιμοποιήσεις το BackgroundWorker component το οποίο απλοποιεί πάρα πολύ τη δημιουργία background threads. Αναλαμβάνει το ίδιο τον έλεγχο του thread, να κλείσει σωστά ένα thread (το Abort είναι κακή ιδέα) και να στείλει μηνύματα από το thread στη φόρμα. Επίσης, κοίτα και τα samples του MSDN για sockets, καθώς ο κώδικας που βλέπω μου φαίνεται μάλλον μπερδεμένος. Δες τα "Asynchronous Server Socket Example" και το "Using an Asynchronous Server Socket"


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  16-06-2007, 21:40 32980 σε απάντηση της 32979

    Απ: thread problem

    Ευχαριστώ πάρα πολύ για την άμεση απάντησή σου

     

    Το πρόβλημα μου στον κώδικα όπως εντόπισες είναι το ότι θέλω να πειράξω τα controls της φόρμας κατά τα άλλα δουλεύουν όλα σωστά και από ότι δοκίμασα και το threading

     

     

    Ευχαριστώ πολύ

  •  17-06-2007, 02:30 32983 σε απάντηση της 32976

    HELP!!!!!!!!!!!!!!!!!!!!

    Παιδιά όσο και να διαβάζω δεν τα καταφέρνω

     

    Μπορεί κανείς να μου πει πως θα παίξει το παρακάτω


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Form1.Load
            Dim kos As New startup
            Dim thread2 As New Thread(New ThreadStart(AddressOf kos.run))
            thread2.Start()
        End Sub
        Class startup
            Public Sub run()
                dpserver.DataGridView1.Rows.Add("1", "2", "3")
            End Sub
    End Class
  •  18-06-2007, 09:00 33000 σε απάντηση της 32983

    Απ: HELP!!!!!!!!!!!!!!!!!!!!

    Τι από αυτά που σου πρότεινε ο Παναγιώτης διαβάζεις και προσπαθείς να υλοποιήσεις; Το παραπάνω αποκλείεται να παίξει γιατί όπως είπαμε, δεν πρέπει να πειράζεις τα controls της φόρμας από άλλα threads πέρα από αυτό που την ξεκίνησε.


    Vir prudens non contra ventum mingit
  •  20-06-2007, 21:48 33079 σε απάντηση της 33000

    Απ: HELP!!!!!!!!!!!!!!!!!!!!

    έκανα αυτό με το

    Delegate Sub αλλα δεν μου έπεξε

    και δεν ξέρω τι άλλο να δοκιμάσω

Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems