Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 8 của 8
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Chương trình UdpChat, lỗi thread lạ khi dùng lisbox xuất mesage


  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    hi. Dùng thread hay bị thế lắm, bạn fix kiểu này là được. Chỗ nào muốn gán giá trị thì gọi hàm bt là ok.

    Mã:
     delegate void updateConversionTextDelegate(string newText);        private void updateConversion(string newText)        {            if (txtConversion.InvokeRequired)            {                // this is worker thread                updateConversionTextDelegate del = new updateConversionTextDelegate(updateConversion);                txtConversion.Invoke(del, new object[] { newText });            }            else            {                // this is UI thread                txtConversion.Text +=strDisPlayName+ ":" + newText+"
    ";            }        }

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Mình mới làm quen C# nên không rõ lắm. Nhưng mà thay thế dòng gán s vào lisbox bằng cái hàm updateConversion(s) thì không báo lỗi nữa, nhưng lisbox không hiện thông điệp gì. Vì nó toàn vào trường hợp
    Mã:
    lisbox.InvokeRequired == true
    Mình dùng 2 chương trình VS2010 để chạy thử. F5 chạy rồi, nhập IP xong vẫn ok, gửi qua thì bên nhận thông báo lỗi ngoại lệ ngay dòng gán text cho lisbox, mà cái đó lại liên quan đến thread nên mình không biết lỗi do đâu. Còn bên gửi thì hiện ra lisbox ok.
    Nhờ bạn gỡ rối dùm, sao cho nó có thể in ra thông điệp khi gửi qua. Mình không rành c# lắm

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    http://diendan.congdongcviet.com/showthread.php?t=5794
    xem thử link này đi ^^

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Mình đã sửa lại như ở dưới nhưng lisbox không được sử dụng. Không in ra message mà rõ ràng chuỗi s nhận được thông điệp gửi đến

    Mã:
    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Net;using System.Net.Sockets;using System.Threading; namespace UDPChat{    public partial class Form1 : Form    {        private string s;        public Form1()        {            InitializeComponent();            CheckForIllegalCrossThreadCalls = true;        }         private void buttonSend_Click(object sender, EventArgs e)        {            UdpClient send = new UdpClient();            IPEndPoint iepRemote = new IPEndPoint(IPAddress.Parse(textBoxIP.Text), int.Parse(textBoxP.Text));            byte[] data = new byte[1024];            data = Encoding.UTF8.GetBytes(textBoxSend.Text);            send.Send(data, data.Length, iepRemote);            listBox.Items.Add("Sender: " + textBoxSend.Text + "
    ");            textBoxSend.Clear();            if (textBoxSend.Text.ToUpper().Equals("bye")) this.Dispose();        }         private void buttonConn_Click(object sender, EventArgs e)        {            Thread tuyen = new Thread(new ThreadStart(NhanDL));            tuyen.IsBackground = true;            tuyen.Start();        }         private void NhanDL()        {            UdpClient receiver = new UdpClient(int.Parse(textBoxLCP.Text));            IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0);            while (true)            {                byte[] data = new byte[1024];                data = receiver.Receive(ref iep);                s = Encoding.UTF8.GetString(data);                if (s.Trim().ToUpper().Equals("bye")) break;                //listBox.Text += "Receiver: " + s + "
    ";                CrossThread();             }        }        private void CrossThread()        {            updateConversion(s);        }         delegate void updateConversionTextDelegate(string newText);        private void updateConversion(string newText)        {            if (this.listBox.InvokeRequired)            {                // this is worker thread                this.Invoke(new updateConversionTextDelegate(updateConversion), new object[] { newText });            }            else            {                // this is UI thread                this.listBox.Text += "Receiver: " + newText + "
    ";            }        }        private void labelIP_Click(object sender, EventArgs e)        {         }         private void textBoxIP_TextChanged(object sender, EventArgs e)        {         }         private void textBoxP_TextChanged(object sender, EventArgs e)        {         }         private void labelPort_Click(object sender, EventArgs e)        {         }         private void labelLCP_Click(object sender, EventArgs e)        {         }         private void textBoxLCP_TextChanged(object sender, EventArgs e)        {         }         private void textBoxSend_TextChanged(object sender, EventArgs e)        {         }         public void listBox_SelectedIndexChanged(object sender, EventArgs e)        {         }     }}
    Mọi người xem giúp mình với. Hay là mình áp dụng sai hoặc có chỗ nào không đúng.

    p/s: Cái này phức tạp quá. Nếu có cách không cần gọi lisbox trong phương thức NhanDL mà vẫn in ra kết quả thì các bạn giúp mình nhé

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Mình đóng góp 1 cách viết khác trong việc tương tác với control khi dùng thread:

    Mã:
    while(true)
    {
    this.Invoke((MethodInvoker)delegate
    {
    listBox.Items.Add(....);
    });
    }

  7. #7
    Bạn sửa:
    this.listBox.Text += "Receiver: " + newText + "
    ";
    thành
    listBox.Items.Add("Receiver: " + newText + "
    ");
    thử coi ổn ko?

  8. #8
    Cám ơn các bạn nhiều.

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •