Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 14 kết quả

Đề tài: soft bị treo do vòng for xử lý quá nhiều, có nên dùng kĩ thuật đa luồng

  1. #1
    Ngày gia nhập
    04 2011
    Bài viết
    83

    Mặc định soft bị treo do vòng for xử lý quá nhiều, có nên dùng kĩ thuật đa luồng

    e dùng 1 vòng for để quét tất cả các folder và file có mặt trong 1 path, vì vậy khi nó quét thì sẽ xảy ra vấn đề là treo soft trong thời gian ngắn do path chứa quá nhiều folder + file, nghe 1 anh kia nói cần dùng đa luồng để giải quyết vấn đề này, vậy dùng như thế nào, để vòng soft không bị treo do for

    VD: vòng for này bị treo
    Visual C# Code:
    1. for (int i = 0; i < 100; i++)
    2.     MessageBox.Show("abc");
    vậy xử lý luồng như thế nào đối với đoạn code này, anh nào có thể giúp em

  2. #2
    Ngày gia nhập
    08 2011
    Nơi ở
    Hà Nội | http://ipmac.vn
    Bài viết
    198

    Xử lý đa luồng : bạn chịu khó search gôgle vơi từ khóa C# multithread hoặc C# đa luồng là có sample ngay vì cái này là cơ bản.

    Có một cách khác không cần đa luồng (mẹo) : ở giữa mỗi vòng lặp bạn thêm System.Threading.Thread.Sleep(100); thì chương trình cũng đỡ bị đơ.

    Nhưng cách tốt nhất vãn là đa luồng
    Bao chàng trai không tiếc tuổi xuân đang viết nhiều chương trình
    Em đẹp xinh cũng quyết lập công chưa muốn lấy chồng
    http://ipmac.vn/ <- Học lập trình ... sư
    http://laptrinh.tv/ <- Kênh chia sẻ video học IT
    http://www.youtube.com/user/anhnt3 <- Video thực hành lập trình... sư từ A-Z

  3. #3
    Ngày gia nhập
    04 2011
    Bài viết
    83

    Trích dẫn Nguyên bản được gửi bởi anhnt3 Xem bài viết
    Xử lý đa luồng : bạn chịu khó search gôgle vơi từ khóa C# multithread hoặc C# đa luồng là có sample ngay vì cái này là cơ bản.

    Có một cách khác không cần đa luồng (mẹo) : ở giữa mỗi vòng lặp bạn thêm System.Threading.Thread.Sleep(100); thì chương trình cũng đỡ bị đơ.

    Nhưng cách tốt nhất vãn là đa luồng
    Thanks anh, em đã đọc ở trang này http://vubka.blogspot.com/2010/06/vi...reading-c.html khá chi tiết, nhưng e thật không hiểu, vậy với VD ban đầu của e thì có xử lý đa luồng được hok

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

    Trích dẫn Nguyên bản được gửi bởi anhnt3 Xem bài viết
    Có một cách khác không cần đa luồng (mẹo) : ở giữa mỗi vòng lặp bạn thêm System.Threading.Thread.Sleep(100); thì chương trình cũng đỡ bị đơ.
    Mình ko hiểu rõ khái niệm đơ chương trình của bạn là như thế nào ? Nếu bạn thêm sleep vào thì người dùng cũng vẫn ko thể tác động vào các điều khiển trên giao diện của chương trình, như vậy sao lại đỡ bị đơ hơn ? Một chương trình có giao diện bị đơ khi nó ko còn khả năng tiếp nhận và xử lý các sự kiện nữa. Chương trình của chủ topic có lẽ bị đơ là do trong hàm xử lý sự kiện nào đó mãi lo xử lý mà ko chịu trả về. Sự kiện tiếp theo sẽ ko được đáp ứng. Nhưng bị đơ đó là về mặt người dùng, nhưng thực tế thì chương trình vẫn đang chạy, chạy rất hăng là đằng khác. Có 1 khả năng khác gây đơ là khi trên máy có 1 cpu thì việc chương trình full load sẽ gây đơ. Nhưng cái này đơ cả hệ thống luôn vì cpu đã hết khe thời gian xử lý cho các chương trình khác. Bản thân của chương trình gây full load vẫn đang chạy bình thường. Còn máy nhiều core thì ko có chuyện bị đơ hệ thống khi có 1 chương trình mono-thread full load vì các core khác vẫn còn có khả năng xử lý được.
    Tóm lại, trong cả 2 trường hợp thì mẹo của bạn cũng ko giải quyết được gì. Chưa kể vòng for xử lý nhiều mà sleep(100) thì chạy đến tết cũng ko ra.


    Trích dẫn Nguyên bản được gửi bởi chitvivo Xem bài viết
    Thanks anh, em đã đọc ở trang này http://vubka.blogspot.com/2010/06/vi...reading-c.html khá chi tiết, nhưng e thật không hiểu, vậy với VD ban đầu của e thì có xử lý đa luồng được hok
    Thread bản chất cũng là 1 hàm. Do đó nơi nào gọi hàm được thì nơi đó có thể tạo thread. Chỉ có vấn đề là dùng thread sẽ mang lại hiệu quả như thế nào thôi. Về mặt code, bạn chỉ cần gom tất cả xử lý đó vô 1 hàm, và dùng thread để gọi hàm đó là xong.
    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
    08 2011
    Nơi ở
    Hà Nội | http://ipmac.vn
    Bài viết
    198

    Cám ơn mèo nhé, tớ nhầm chuồng

    Có thể dùng Application.DoEvents ở mỗi bước lặp để Form paint lại -> đỡ bị đỡ giao diện không ?
    Bao chàng trai không tiếc tuổi xuân đang viết nhiều chương trình
    Em đẹp xinh cũng quyết lập công chưa muốn lấy chồng
    http://ipmac.vn/ <- Học lập trình ... sư
    http://laptrinh.tv/ <- Kênh chia sẻ video học IT
    http://www.youtube.com/user/anhnt3 <- Video thực hành lập trình... sư từ A-Z

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

    Mặc định soft bị treo do vòng for xử lý quá nhiều, có nên dùng kĩ thuật đa luồng

    Trích dẫn Nguyên bản được gửi bởi anhnt3 Xem bài viết
    Cám ơn mèo nhé, tớ nhầm chuồng

    Có thể dùng Application.DoEvents ở mỗi bước lặp để Form paint lại -> đỡ bị đỡ giao diện không ?
    Dùng Application.DoEvents trong lúc đang xử lý có thể làm chương trình đỡ bị đơ mà chuyển sang trạng thái bị lắc. Người dùng sẽ có cảm giác chương trình chạy ngắt quãng, lúc tương tác được, lúc lại ko làm gì được cả. Nhưng Application.DoEvents cũng có 1 số khuyết điểm nhất định. Thứ nhất là chi phí xử lý dành cho hàm này cũng khá nhiều. Thứ 2 thì bạn xem ví dụ dưới :

    Visual C# Code:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Windows.Forms;
    4.  
    5. namespace WindowsFormsApplication1
    6. {
    7.     static class Program
    8.     {
    9.         static Form frm = null;
    10.        
    11.         [STAThread]
    12.         static void Main()
    13.         {
    14.             Application.EnableVisualStyles();
    15.             Application.SetCompatibleTextRenderingDefault(false);
    16.  
    17.             Button btn = null;
    18.  
    19.             frm = new Form();
    20.             frm.Width = 350;
    21.             frm.Height = 350;
    22.             frm.StartPosition = FormStartPosition.CenterScreen;
    23.             frm.FormClosing += Form1_Closing;
    24.  
    25.             btn = new Button();
    26.             btn.Text = "Button1";
    27.             btn.Left = 20;
    28.             btn.Top = 20;
    29.             btn.Height = 30;
    30.             btn.Click += Button1_Click;
    31.             frm.Controls.Add(btn);
    32.  
    33.             btn = new Button();
    34.             btn.Text = "Button2";
    35.             btn.Left = 20;
    36.             btn.Top = 70;
    37.             btn.Height = 30;
    38.             btn.Click += Button2_Click;
    39.             frm.Controls.Add(btn);
    40.  
    41.             Application.Run(frm);
    42.         }
    43.  
    44.         static void DoFoo()
    45.         {
    46.             System.Threading.Thread.Sleep(10); // đừng có dại dột bỏ dòng này
    47.         }
    48.  
    49.         static void Form1_Closing(object sender, EventArgs e)
    50.         {
    51.             Environment.Exit(0);
    52.         }
    53.  
    54.         static void Button1_Click(object sender, EventArgs e)
    55.         {
    56.             int i = 0;
    57.             while (true)
    58.             {
    59.                 frm.Text = "Button1 ( " + i.ToString() + " )";
    60.                 i = (i + 1) % 1000000;
    61.                 DoFoo();
    62.                 Application.DoEvents();
    63.             }
    64.         }
    65.  
    66.         static void Button2_Click(object sender, EventArgs e)
    67.         {
    68.             int i = 0;
    69.             while (true)
    70.             {
    71.                 frm.Text = "Button2 ( " + i.ToString() + " )";
    72.                 i = (i + 1) % 1000000;
    73.                 DoFoo();
    74.                 Application.DoEvents();
    75.             }
    76.         }
    77.  
    78.     }
    79. }

    Khi chạy chương trình, bạn bấm button1. Lúc button1 đang được DoEvents, bạn tranh thủ bấm button2. Bạn sẽ thấy hàm xử lý của button1 sẽ phải dừng chờ cho đến khi button2 xử lý xong. Nếu bạn lại tranh thủ bấm button1 trong lúc button2 đang DoEvents thì button2 lại phải chờ button1 xong. Cứ như thế, công việc ngày càng chồng chất và stack của chương trình ngày càng đầy. Và như thế sẽ gây lãng phí tài nguyên mà công việc lại càng phức tạp, nặng nề hơn.
    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.

  7. #7
    Ngày gia nhập
    08 2011
    Nơi ở
    Hà Nội | http://ipmac.vn
    Bài viết
    198

    Mèo giỏi quá -> hôm nào ra Hà Nội giao lưu đi.

    Đúng là Application.DoEvents nó có cái dở như bạn chỉ ra.
    Vậy bạn có thể chỉ giúp trường làm nào dùng Application.DoEvents trường hợp nào nên dùng Thead không ?
    Bao chàng trai không tiếc tuổi xuân đang viết nhiều chương trình
    Em đẹp xinh cũng quyết lập công chưa muốn lấy chồng
    http://ipmac.vn/ <- Học lập trình ... sư
    http://laptrinh.tv/ <- Kênh chia sẻ video học IT
    http://www.youtube.com/user/anhnt3 <- Video thực hành lập trình... sư từ A-Z

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

    Mình ở tp HCM, sao có tiền ra HN được.

    Thật ra ko có tiêu chuẩn nào cho cái này. Theo ý kiến cá nhân của mình thì AppDoevents chỉ nên dùng trong trường hợp hàm xử lý sự kiện phải thực hiện 1 công việc gì đó tương đối lâu ( khoảng dưới 10s ). Thứ 2 là công việc đó phải biết chắc chắn là nó có kết thúc và thời điểm kết thúc phải được xác định. Nếu ko chắc bao giờ mới xong hoặc chạy quá lâu thì bạn nên dùng thread.
    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.

  9. #9
    Ngày gia nhập
    04 2011
    Bài viết
    83

    Em viết thế này
    Visual C# Code:
    1.  private void buttonX1_Click(object sender, EventArgs e)
    2.         {
    3.            
    4.             ThreadStart ts1 = new ThreadStart(ABC);
    5.             Thread tA = new Thread(ts1);
    6.             label2.Text = a;
    7.             label1.Text = b;
    8.         }
    9.         void ABC()
    10.         {
    11.          
    12.             for (int i = 0; i < 100; i++)
    13.             {
    14.                 a = i.ToString();
    15.                 for (int j = 0; j < 100; j++)
    16.                     b = j.ToString();
    17.             }
    18.         }
    không biết có đúng và có tác dụng không

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

    Thiếu tA.Start() ở cuối hàm buttonX1_Click
    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.

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

  1. Dùng vòng lặp để thay thế nhiều mệnh đề IF?
    Gửi bởi kittynguyen89 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 10
    Bài viết cuối: 31-12-2012, 08:31 AM
  2. Treo form do load 1 bảng có quá nhiều mẫu tin
    Gửi bởi khanhduy.8hpm trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 9
    Bài viết cuối: 27-07-2012, 09:20 PM
  3. Graphic Cách khác phục việc thiết kế form dùng nhiều control nên khi form load khá lâu
    Gửi bởi killdog9x trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 7
    Bài viết cuối: 30-05-2012, 03:08 PM
  4. Bài tập C++ Nên dùng thuật toán j cho bài toán tối ưu cắt thép???
    Gửi bởi ankkoh trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 03-09-2011, 01:34 PM
  5. Nén 1 xâu còn 25% độ dài, nên dùng thuật toán nào?
    Gửi bởi longtth trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 24-08-2011, 11:01 AM

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