الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

cross-thread operation not vaild

بدأه basma_ah في 28 مايو 2011 · 9 رد · 1,500 مشاهدة · في برمجة الشبكات والتطبيقات الموزعة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

احاول تطبيق المثال الموجود في كتاب الاستاذ فادي عبد القادر في ارسال الصور والرسائل من المتصل الى الملقم البرنامج يعمل بشكل ممتاز في ارسال الصور ولكن عند ارسال رسالة نصية يقف على الملقم عند عرضها في textBox

cross-thread operation not valid 'TextBox' a ccessd from a thread other than the thread it was creat for

مع العلم ان الرسالة تصل الى الملقم واستطيع عرضها في messageBox

افيدوني رجاء :excl:

#2

السلام عليكم

الافضل انك وضعت المثال لكن لا يوجد مشكلة

الحل لهذه المشكله كالتالي :-

الطريقة الاولى عن طريق delegate

لو انك وضعت المثال لرأيتك كيف يتم ذلك

---------------------------------------------------

الطريقة الثانية والاسهل

اكتب عند بداية تنفيذ البرنامك هذا السطر

 Control.CheckForIllegalCrossThreadCalls = false;

وشكرا

291964_260506123967115_206850989332629_1001538_45132_n.jpg

اللهم إني أعوذ بك من علم لا ينفع ، ومن قلب لا يخشع ، ومن نفس لا تشبع ، ومن دعوة لا يستجاب لها

#3

كما قال أخي ayash يمكنك استخدام

System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;

لكن إستعمالها خطر ويعتمد على ال implementation الذي تقوم به.

" إن الله كتب الإحسان على كل شيء"

::

الإرادة ... تحقق السيادة.

#4

السلام عليكم ورحمة الله وبركاته

مشكورين جمعيا على المرور والرد السريع

البرنامج الذ استخدمة من ناحية المتصل هو

    
 Private Sub send(ByVal msg As String) ' overloading method
			Try
				Dim myclient As TcpClient = New TcpClient (txt_host.Text,7000)
				Dim myns As NetworkStream = myclient.GetStream ()
				Dim mysw As StreamWriter = New StreamWriter (myns)
				mysw.Write(msg)
				mysw.Close ()
				myns.Close ()
				myclient.Close ()
			Catch ex As Exception
				MessageBox.Show(ex.Message)
			End Try
		End Sub

ومن جهة الملقم سيكمون الاستقبال

Private Sub text_Receiver()
            mytcpl = New TcpListener(7000) ' Open The Port
            mytcpl.Start() ' Start Listening on That Port
            mysocket = mytcpl.AcceptSocket() ' Accept Any Request From Client and Start a Session
            myns = New NetworkStream(mysocket) ' Receives The Binary Data From Port
            sr = New StreamReader(myns) ' Convert Received Data to String
            Dim order As String = sr.ReadLine()
            textBox1.Text = sr.ReadLine()
            mytcpl.Stop()
				Do While True
					text_Receiver() ' Back to First Method
				Loop
end sub

اما التطبيق الذي ارغب بتحقيقية هو عمل برنامج للمحادثة

#5

السلام عليكم ورحمه الله وبركاته

اختي يمكنك استخدام الاداه الموجوده في الرابط التالي http://www.codeproject.com/KB/vb/UdpPeer.aspx مع مثال يوضح طريقة عملها

−1

.:: Wish to become better and better ::.

#6

السلام عليكم

اختي الكريمة هذا الكود اعملتلك اياه على

delegate

---------------------------

هذا كود الclient

Imports System.Net.Sockets
Imports System.Text

Public Class Form1
    Public Sub Send(ByVal sMessage As String)
        Try
            Dim MySocket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
            MySocket.Connect("127.0.0.1", 5000)
            Dim Buffer() As Byte = UnicodeEncoding.Unicode.GetBytes(sMessage)
            MySocket.Send(Buffer)
            MySocket.Close()

        Catch ex As Exception
            MessageBox.Show("" + ex.Message)

        End Try
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Send("arabteam")

    End Sub
End Class

وهذا كود الserver

Imports System.Net
Imports System.Text
Imports System.Net.Sockets
Imports System.Threading


Public Class Form1
    Public Delegate Sub DelegateReciveMessage(ByVal Message As String)

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim StartListen As New Thread(New ThreadStart(AddressOf ReciveMessage))
        StartListen.IsBackground = True
        StartListen.Start()

    End Sub

    Public Sub ReciveMessage()
        Dim MySocket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
        Dim EndPoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 5000)
        MySocket.Bind(EndPoint)
        MySocket.Listen(-1)
        While True
            Dim MySocket2 As Socket = MySocket.Accept()
            Dim Buffer(1024) As Byte

            MySocket2.Receive(Buffer)

            Dim Messege As String = UnicodeEncoding.Unicode.GetString(Buffer)

            'هنا يتم تمرير الرسالة للميثود 
            'showMessgae
            'حيث يتم استقبال الرسالة واظهارها في
            'textbox

            Me.Invoke(New DelegateReciveMessage(AddressOf ShowMessage), Messege)


        End While
        MySocket.Close()

    End Sub
    Public Sub ShowMessage(ByVal sMessage As String)
        TextBox1.Text = sMessage

    End Sub
End Class

=============================================================

وهذا نفس المثال لكن باستعمال Control.CheckForIllegalCrossThreadCalls = false

التغيير الذي حصل فقط في كود الserver

والكود كالتالي

Imports System.Net
Imports System.Text
Imports System.Net.Sockets
Imports System.Threading


Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim StartListen As New Thread(New ThreadStart(AddressOf ReciveMessage))
        StartListen.IsBackground = True
        StartListen.Start()

        'انظر هنا 
        Control.CheckForIllegalCrossThreadCalls = False

    End Sub

    Public Sub ReciveMessage()
        Dim MySocket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
        Dim EndPoint As IPEndPoint = New IPEndPoint(IPAddress.Any, 5000)
        MySocket.Bind(EndPoint)
        MySocket.Listen(-1)
        While True
            Dim MySocket2 As Socket = MySocket.Accept()
            Dim Buffer(1024) As Byte

            MySocket2.Receive(Buffer)

            Dim Messege As String = UnicodeEncoding.Unicode.GetString(Buffer)

            TextBox1.Text = Messege


        End While
        MySocket.Close()

    End Sub

End Class

-------------------------------------------------------------------------------------------------------------------------------------------------------

بالتوفيق

تم تعديل هذه المشاركة بواسطة ayash في 31 مايو 2011 في 14:50

1

291964_260506123967115_206850989332629_1001538_45132_n.jpg

اللهم إني أعوذ بك من علم لا ينفع ، ومن قلب لا يخشع ، ومن نفس لا تشبع ، ومن دعوة لا يستجاب لها

#7

السلام عليكم ورحمة الله وبركاته

مشكور اخي جزاك الله كل الخير

لي عندك رجاء اود ان اعمل log in للبرنامجي مع استخدام قاعدة للبيانات من ناحية الملقم طبعا, لكن لم اجد الفكرة في كيفية تمرير كل من الاسم وكلمة السر في نفس الوقت وارجاع كمية من المعلومات المتعلقة بالمستخدم في حالة قبول الاتصال , الفكرة التي تدور في بالي ان استخدم اثنين من الستريم لارسال الاسم وكلمة السر لكن اجدها غير فعالة لابد من وجود خواص للمتصل تساعد في هذا الامر

افدني بخبرتك ومشكور مقدما على المساعدة

#8

السلام عليكم اختي

----------------------------------

الذي فهمته منك انكي تريديتن يان يتم ادخال الusername و الpassword في طرف الclient و ارسال القيم الى طرف الserver ليتم التاكد من ان المستخدم مسجل ام لا

----------------------------------------

اذا كان هذا ما تريدينه افعلي ما يلي حيث عملية الارسال هنا في stream واحد

لنفرض انه يتم وضع اسم المستخدم في textbox1

وان الرقم السري يتم وضعه في textbox2

الان عندما يتم الضغط على button يتم ارسال القيم الى الserver

قبل ارسال القيم اعملي دمج بين الاسم والرقم السري في string ولنرض الstring اسمه x وهو الذي يتم ارساله الى طرف الserver وفي طرف الserver يتم فصل الرقم السري والاسم ليتم مقارنتها في الdatabase واذا وجد المستخدم مسجل في الdatabase يتم قبول الاتصال

الكود المسئول عن الدمج في طرف الclient i هو

 Dim x As String
        x = TextBox1.Text + ";" + TextBox2.Text

والكود المسؤول عن عملية فك الدمج او الفصل في طرف الserver

هو

   Dim x As String
        x = "هنا الرسالة التي ارسلها العميل  هوي التي تحتوي الاسو والرقم السري المدموجة"


        Dim index As Integer = x.IndexOf(";")
        Dim name As String = x.Substring(0, index)
        Dim password As String = x.Substring(index + 1)

إن شاء الله يكون الفكرة وصلت

1

291964_260506123967115_206850989332629_1001538_45132_n.jpg

اللهم إني أعوذ بك من علم لا ينفع ، ومن قلب لا يخشع ، ومن نفس لا تشبع ، ومن دعوة لا يستجاب لها

#9

السلام عليكم ورحمة الله وبركاته

وصلت الفكرة جزاك الله عني كل الخير وبارك الله لك في عملك وعلمك

#10

هلا بيكي

291964_260506123967115_206850989332629_1001538_45132_n.jpg

اللهم إني أعوذ بك من علم لا ينفع ، ومن قلب لا يخشع ، ومن نفس لا تشبع ، ومن دعوة لا يستجاب لها

مواضيع مشابهة