Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: Sử dụng Multithread , ứng dụng bị treo . Cần giúp đỡ .

  1. #1
    Ngày gia nhập
    03 2008
    Bài viết
    54

    Mặc định Sử dụng Multithread , ứng dụng bị treo . Cần giúp đỡ .

    Mình mới tìm hiểu về C# và multi threadding . Mình có viết 1 ví dụ để tìm hiểu .
    Trích dẫn:
    Code:
    1 - 1
    2 - 1
    1 - 2
    2 - 2
    1 - 3
    2 - 3
    1 - 4
    2 - 4
    1 - 5
    2 - 5
    1 - 6
    2 - 6
    1 - 7
    2 - 7
    1 - 8
    ... Mình muốn chúng từ từ hiện ra (delay 500ms) theo thứ tự ntn trên richtextbox

    Mặc dù mình tạo 2 thread khác nhau, sleep thực hiện ở mỗi thread
    nhưng sau khi click button thì cả ứng dụng bị treo .
    Mong dc các bạn giúp đỡ và cho cách giải quyết. Cám ơn nhiều.

    Code:
    Code:
    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.Threading;
    
    namespace ThreadExample
    {
        public partial class Form1 : Form
        {
            string str;
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                Thread th1, th2;
                str = "";
                richTextBox1.Text += str;
    
                Sub1 Sub = new Sub1();
                for (int i = 1; i < 55; i += 1)
                {
                    th1 = new Thread(delegate()
                        {
                            str = Sub.action(i, "1");
                        });
                    th2 = new Thread(delegate()
                    {
                        str = Sub.action(i, "2");
                    });
                    th1.Start();
                    th1.Join();
                    richTextBox1.Text += str;
    
                    th2.Start();
                    th2.Join();
                    richTextBox1.Text += str;
                }
            }
        }
        class Sub1
        {
            public string action(int i_1, string i_2)
            {
                string str = "";
                str = i_2 + " - " + i_1 + "\r\n";
                Thread.Sleep(500);
                return str;
            }
        }
    }
    Mình nghĩ là do sử dụng .Join() - Vậy thì làm sao để sửa bây giờ . Mong các bro giúp đỡ . Cám ơn nhiều .

    http://diendan.congdongcviet.com/showthread.php?t=81792
    Vấn đề của tôi gặp phải rất cơ sở, Xin hỏi MOD là còn cần rõ ràng đến mức độ nào nữa ?
    Không biết thì mới phải hỏi , có code kèm theo rõ ràng. Chẳng hiểu sao Mod lại quy vào Spam bài viết .

  2. #2
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Bạn sử dụng thread mà y chang như chạy 1 thread. Mục đích tạo thread là để làm việc song song, thread chính sẽ lo làm việc khác. Đằng này bạn lại Join ( MSDN: Blocks the calling thread until a thread terminates ), tức là phải chờ cho đến khi thread kia thoát bạn mới làm tiếp. Về mặt tính chất còn lâu hơn cả gọi hàm trực tiếp nữa.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  3. #3
    Ngày gia nhập
    03 2008
    Bài viết
    54

    Trích dẫn Nguyên bản được gửi bởi meoconlongvang Xem bài viết
    Bạn sử dụng thread mà y chang như chạy 1 thread. Mục đích tạo thread là để làm việc song song, thread chính sẽ lo làm việc khác. Đằng này bạn lại Join ( MSDN: Blocks the calling thread until a thread terminates ), tức là phải chờ cho đến khi thread kia thoát bạn mới làm tiếp. Về mặt tính chất còn lâu hơn cả gọi hàm trực tiếp nữa.
    Mình biết là như vậy rồi , But cách xử lý ntn ? . Với công việc mình muốn làm:
    Hiển thị trên richtextbox như với console ở code phía dưới .

    Thay Console.Write(str);
    bằng Rich bằng Richtextbox thì mình bị lỗi CrossThread :(
    Code:
    namespace Thread_Console_C
    {
        class Program
        {
            static void Main(string[] args)
            {
                Thread th1, th2;
                sub s1 = new sub();
    
                th1 = new Thread(delegate()
                {
                    s1.action(11, ".",300);
                });
                th2 = new Thread(delegate()
                {
                    s1.action(11, "I",800);
                });
    
                th1.Start();
                th2.Start();
    
                Console.ReadLine();
            }
        }
        class sub
        {
            public void  action(int i_1, string i_2,int i_timewait)
            {
                string str = "";
                int i = 0;
                do
                {
                    str = i_2 + " - " + i + "\r\n";
                    Console.Write(str);
                    Thread.Sleep(i_timewait);
                    i += 1;
                } while (i < i_1);
    
            }
        }
    }
    www.youtube.com/watch?v=Mf9PqeZrfJw
    Đã được chỉnh sửa lần cuối bởi nghich3 : 13-01-2012 lúc 05:27 PM.

  4. #4
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Trước hết là bạn ko xài join nữa mà dùng thread truy xuất richtext luôn. Muốn tránh crossthread thì trong constructor của form set thuộc tính Control.CheckForIllegalCrossThreadCalls = false. Còn nếu siêng hơn thì dùng InvokeRequire kết hợp delegate. Delegate và Invoke mình xin ko nói lại vì 4rum đã có nhiều bài rồi.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  5. #5
    Ngày gia nhập
    03 2008
    Bài viết
    54

    Trích dẫn Nguyên bản được gửi bởi meoconlongvang Xem bài viết
    Bạn sử dụng thread mà y chang như chạy 1 thread. Mục đích tạo thread là để làm việc song song, thread chính sẽ lo làm việc khác. Đằng này bạn lại Join ( MSDN: Blocks the calling thread until a thread terminates ), tức là phải chờ cho đến khi thread kia thoát bạn mới làm tiếp. Về mặt tính chất còn lâu hơn cả gọi hàm trực tiếp nữa.
    Trích dẫn Nguyên bản được gửi bởi meoconlongvang Xem bài viết
    Trước hết là bạn ko xài join nữa mà dùng thread truy xuất richtext luôn. Muốn tránh crossthread thì trong constructor của form set thuộc tính Control.CheckForIllegalCrossThreadCalls = false. Còn nếu siêng hơn thì dùng InvokeRequire kết hợp delegate. Delegate và Invoke mình xin ko nói lại vì 4rum đã có nhiều bài rồi.
    Mình chỉ cần bạn gợi ý như vậy .

    Cám ơn bạn nhiều . :x :x

Các đề tài tương tự

  1. Bài tập C++ [Help] Xin định hướng làm bài tập về multithread HĐH
    Gửi bởi bladevn trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 3
    Bài viết cuối: 14-11-2011, 05:52 PM
  2. dùng MultiThread không có tác dụng, app vẫn bị treo?
    Gửi bởi chitvivo trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 32
    Bài viết cuối: 05-09-2011, 10:54 AM
  3. Lập trình C# | Dialog bị treo khi làm việc với thread. Giúp mình sửa lỗi?
    Gửi bởi hoanvuphan trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 02-06-2009, 06:06 AM
  4. Hỏi về lập trình Multithread trong C
    Gửi bởi zangpt trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 01-08-2008, 09:09 AM

Tags của đề tài này

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn