Trang 1 trên tổng số 4 123... Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 33 kết quả

Đề tài: dùng MultiThread không có tác dụng, app vẫn bị treo?

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

    Mặc định dùng MultiThread không có tác dụng, app vẫn bị treo?

    Visual C# Code:
    1.  private void button6_Click(object sender, EventArgs e)
    2.         {
    3.                 ThreadStart ts1 = new ThreadStart(CrossThread);
    4.                 Thread tA = new Thread(ts1);
    5.                 tA.Start();            
    6.            
    7.         }
    8.  
    9.         private void CrossThread()
    10.         {
    11.             CayThuMuc(textBox1.Text);
    12.         }
    13.         private delegate void dlgAddItemN(string n);
    14.         void CayThuMuc(string sDiaChi)
    15.         {
    16.             if (this.InvokeRequired)
    17.             {
    18.                 this.Invoke(new dlgAddItemN(CayThuMuc), sDiaChi);
    19.             }
    20.             else
    21.             {
    22.                 textBox2.Text =sDiaChi;
    23.             }
    24.        }
    Đoạn code của em thì tương tự, nhưng khi chạy thì app vẫn bị treo giống như không dùng, ai có thể giải thích giúp em
    Đã được chỉnh sửa lần cuối bởi chitvivo : 30-08-2011 lúc 06:51 PM.

  2. #2
    Ngày gia nhập
    10 2008
    Bài viết
    258

    bạn có thể giải thích ý nghĩa của đoạn code đó không ? mình chẳng hiểu bạn định làm gì cả.
    Anh yêu em hí hí

  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 thansautk Xem bài viết
    bạn có thể giải thích ý nghĩa của đoạn code đó không ? mình chẳng hiểu bạn định làm gì cả.
    thật ra thì đoạn code của em dùng để xác định cây thư mục và trả tất cả về normal thui
    Visual C# Code:
    1.  private delegate void dlgAddItemN(string n);
    2.         void CayThuMuc(string sDiaChi)
    3.         {
    4.             if (this.InvokeRequired)
    5.             {
    6.                 this.Invoke(new dlgAddItemN(CayThuMuc), sDiaChi);
    7.             }
    8.             else
    9.             {
    10.                 string[] DriveList = Directory.GetDirectories(sDiaChi);
    11.                 string[] DriveList2 = Directory.GetFiles(sDiaChi);
    12.                 string strExtension;
    13.                 for (int j = 0; j < DriveList2.Length; j++)
    14.                 {
    15.  
    16.                     File.SetAttributes(DriveList2[j], FileAttributes.Normal);
    17.  
    18.                     if (checkBox2.Checked == true)
    19.                     {
    20.                         strExtension = Path.GetExtension(DriveList2[j]);
    21.  
    22.                         if (strExtension.Substring(strExtension.Length - 3, 3).ToLower() == "lnk")
    23.                             File.Delete(DriveList2[j]);
    24.  
    25.                     }
    26.                 }
    27.                 for (int i = 0; i < DriveList.Length; i++)
    28.                 {
    29.                     string name = DriveList[i].Substring(DriveList[i].LastIndexOf("\\") + 1);
    30.                     switch (name)
    31.                     {
    32.                         case "System Volume Information":
    33.                         case "con":
    34.                             break;
    35.                         default:
    36.                             {
    37.  
    38.                                 File.SetAttributes(DriveList[i], FileAttributes.Normal);
    39.                                 labelX1.Text = DriveList[i];
    40.                                 CayThuMuc(DriveList[i]);
    41.  
    42.                             } break;
    43.                     }
    44.  
    45.                 }
    46.             }
    47.         }

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

    App bị treo có thể là do bạn dùng thread ko đúng chỗ. Bạn up cả project lên xem.
    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
    04 2011
    Bài viết
    83

    Trích dẫn Nguyên bản được gửi bởi meoconlongvang Xem bài viết
    App bị treo có thể là do bạn dùng thread ko đúng chỗ. Bạn up cả project lên xem.
    Dạ,có cả file đính kèm, anh xem giúp em
    Visual C# Code:
    1.  #region Xử lý Cross Thread
    2.         private delegate void dlgAddItemN(string n);
    3.         void CayThuMuc(string sDiaChi)
    4.         {
    5.             if (this.InvokeRequired)
    6.             {
    7.                 this.Invoke(new dlgAddItemN(CayThuMuc), sDiaChi);
    8.             }
    9.             else
    10.             {
    11.                 string[] DriveList = Directory.GetDirectories(sDiaChi);
    12.                 string[] DriveList2 = Directory.GetFiles(sDiaChi);
    13.                 string strExtension;
    14.                 for (int j = 0; j < DriveList2.Length; j++)
    15.                 {
    16.  
    17.                     File.SetAttributes(DriveList2[j], FileAttributes.Normal);
    18.  
    19.                     if (checkBox2.Checked == true)
    20.                     {
    21.                         strExtension = Path.GetExtension(DriveList2[j]);
    22.  
    23.                         if (strExtension.Substring(strExtension.Length - 3, 3).ToLower() == "lnk")
    24.                             File.Delete(DriveList2[j]);
    25.  
    26.                     }
    27.                    
    28.                 }
    29.                 for (int i = 0; i < DriveList.Length; i++)
    30.                 {
    31.                     string name = DriveList[i].Substring(DriveList[i].LastIndexOf("\\") + 1);
    32.                     switch (name)
    33.                     {
    34.                         case "System Volume Information":
    35.                         case "con":
    36.                             break;
    37.                         default:
    38.                             {
    39.  
    40.                                 File.SetAttributes(DriveList[i], FileAttributes.Normal);
    41.                                 labelX1.Text = DriveList[i];
    42.                                 CayThuMuc(DriveList[i]);
    43.  
    44.                             } break;
    45.                     }
    46.                
    47.  
    48.                 }
    49.             }
    50.         }
    51.  
    52.         #endregion
    53.  
    54.         private void button6_Click(object sender, EventArgs e)
    55.         {
    56.            
    57.             if (checkBox1.Checked == true)
    58.             {
    59.                 Directory.CreateDirectory(textBox1.Text + @"\1192fxs");
    60.                 ThreadStart ts1 = new ThreadStart(CrossThread);
    61.                 Thread tA = new Thread(ts1);
    62.                 tA.Start();
    63.                 Directory.Delete(textBox1.Text + @"\1192fxs");
    64.             }
    65.         }
    66.  
    67.         private void CrossThread()
    68.         {
    69.             CayThuMuc(textBox1.Text);
    70.         }
    71.        
    72.   ///////////KET THUC O DAY
    Attached Files Attached Files

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

    Mặc định dùng MultiThread không có tác dụng, app vẫn bị treo?

    Haiz ! Bạn code thế này thì dùng thread để làm cái gì chứ. Bạn chưa hiểu ý nghĩa của InvokeRequired rồi. Trong đoạn code invoke của bạn :
    Visual C# Code:
    1.             if (this.InvokeRequired)
    2.             {
    3.                 this.Invoke(new dlgAddItemN(CayThuMuc), sDiaChi);
    4.             }
    5.             else
    6.             {
    7.                  // .......
    8.             }

    Khi đó this.Invoke(...) sẽ chạy trong ngữ cảnh của thread CrossThread ( thread bạn vừa tạo ra ). Nhưng đoạn code trong else sẽ chạy trong ngữ cảnh của thread tạo ra this, hay cụ thế trong trường hợp này là thread vẽ giao diện. Như vậy toàn bộ code của bạn vẫn chạy chung với thread giao diện và dĩ nhiên là sẽ làm đơ thread giao diện. Trong khi thread mới được tạo ra, bạn lại ko dùng nó. Ví dụ thread giao diện là ông sếp, thread vừa được tạo ra là nhân viên. Ông sếp sẽ kêu nhân viên làm việc. Nhân viên nhận việc xong thì ko làm mà lại chuyển việc lại cho sếp làm tiếp ( thông wa InvokeRequired ), sau đó nhân viên nghỉ làm luôn. Tình trạng của code của bạn hiện nay là như thế đấy. Bạn kết hợp giữa thread và InvokeRequired ko hợp lý. InvokeRequired chỉ nên dùng cho 1 đoạn code rất ngắn và cần thiết phải tác động đến giao diện. Còn bạn đưa hết nguyên 1 cục vô invoke thì khác nào kêu main thread làm tất cả, còn thread tạo ra thì để chơi không.
    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
    04 2011
    Bài viết
    83

    Trích dẫn Nguyên bản được gửi bởi meoconlongvang Xem bài viết
    Haiz ! Bạn code thế này thì dùng thread để làm cái gì chứ. Bạn chưa hiểu ý nghĩa của InvokeRequired rồi. Trong đoạn code invoke của bạn :
    Visual C# Code:
    1.             if (this.InvokeRequired)
    2.             {
    3.                 this.Invoke(new dlgAddItemN(CayThuMuc), sDiaChi);
    4.             }
    5.             else
    6.             {
    7.                  // .......
    8.             }

    Khi đó this.Invoke(...) sẽ chạy trong ngữ cảnh của thread CrossThread ( thread bạn vừa tạo ra ). Nhưng đoạn code trong else sẽ chạy trong ngữ cảnh của thread tạo ra this, hay cụ thế trong trường hợp này là thread vẽ giao diện. Như vậy toàn bộ code của bạn vẫn chạy chung với thread giao diện và dĩ nhiên là sẽ làm đơ thread giao diện. Trong khi thread mới được tạo ra, bạn lại ko dùng nó. Ví dụ thread giao diện là ông sếp, thread vừa được tạo ra là nhân viên. Ông sếp sẽ kêu nhân viên làm việc. Nhân viên nhận việc xong thì ko làm mà lại chuyển việc lại cho sếp làm tiếp ( thông wa InvokeRequired ), sau đó nhân viên nghỉ làm luôn. Tình trạng của code của bạn hiện nay là như thế đấy. Bạn kết hợp giữa thread và InvokeRequired ko hợp lý. InvokeRequired chỉ nên dùng cho 1 đoạn code rất ngắn và cần thiết phải tác động đến giao diện. Còn bạn đưa hết nguyên 1 cục vô invoke thì khác nào kêu main thread làm tất cả, còn thread tạo ra thì để chơi không.
    Em search trên mạng + tự mò nên không lỗi là mừng lắm rồi chứ có ai chỉ em đâu ,anh nói em cũng đã từ từ hiểu ra, vậy khúc code ấy sửa lại như thế nào anh ,anh nói thêm vài phát giúp em, em chỉ mới bắt đầu thui

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

    Mình đã gợi ý cho bạn rồi mà. Đoạn code của bạn có những đoạn cần giao diện, có những đoạn có thể chạy độc lập mà ko cần tác động gì đến giao diện cả. Những đoạn động đến giao diện là những đoạn rất nhỏ, cần Invoke trên đoạn đó. Những đoạn ko cần giao diện thì cứ chạy vô tư trên thread, ko cần Invoke. Giống ví dụ về ông sếp và nhân viên lúc nãy, nhân viên có thể tự làm một số việc, 1 số việc phải đưa sếp duyệt. Việc nào làm được thì nhân viên sẽ làm, việc nào cần sếp duyệt thì giao cho sếp ( Invoke ). Bạn cứ theo đó áp dụng là được thôi. Bí thì lên hỏi tiếp. Mình code sẵn thì bạn cũng ko thể hiểu được bản chất của vấn đề. Mai mốt nếu bạn gặp lại vấn đề này trong hoàn cảnh khác thì sẽ lại lúng túng.
    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

    Trích dẫn Nguyên bản được gửi bởi meoconlongvang Xem bài viết
    Mình đã gợi ý cho bạn rồi mà. Đoạn code của bạn có những đoạn cần giao diện, có những đoạn có thể chạy độc lập mà ko cần tác động gì đến giao diện cả. Những đoạn động đến giao diện là những đoạn rất nhỏ, cần Invoke trên đoạn đó. Những đoạn ko cần giao diện thì cứ chạy vô tư trên thread, ko cần Invoke. Giống ví dụ về ông sếp và nhân viên lúc nãy, nhân viên có thể tự làm một số việc, 1 số việc phải đưa sếp duyệt. Việc nào làm được thì nhân viên sẽ làm, việc nào cần sếp duyệt thì giao cho sếp ( Invoke ). Bạn cứ theo đó áp dụng là được thôi. Bí thì lên hỏi tiếp. Mình code sẵn thì bạn cũng ko thể hiểu được bản chất của vấn đề. Mai mốt nếu bạn gặp lại vấn đề này trong hoàn cảnh khác thì sẽ lại lúng túng.
    a demo 1 cái thật là đơn giản về vấn đề của em giúp em đi, em sẽ tự rút ra kết luận, anh nói thì em hiểu nhưng không có ví dụ thì....

  10. #10
    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 meoconlongvang Xem bài viết
    Mình đã gợi ý cho bạn rồi mà. Đoạn code của bạn có những đoạn cần giao diện, có những đoạn có thể chạy độc lập mà ko cần tác động gì đến giao diện cả. Những đoạn động đến giao diện là những đoạn rất nhỏ, cần Invoke trên đoạn đó. Những đoạn ko cần giao diện thì cứ chạy vô tư trên thread, ko cần Invoke. Giống ví dụ về ông sếp và nhân viên lúc nãy, nhân viên có thể tự làm một số việc, 1 số việc phải đưa sếp duyệt. Việc nào làm được thì nhân viên sẽ làm, việc nào cần sếp duyệt thì giao cho sếp ( Invoke ). Bạn cứ theo đó áp dụng là được thôi. Bí thì lên hỏi tiếp. Mình code sẵn thì bạn cũng ko thể hiểu được bản chất của vấn đề. Mai mốt nếu bạn gặp lại vấn đề này trong hoàn cảnh khác thì sẽ lại lúng túng.
    cho em hỏi cái nào là cái cần giao diện, và invoke như thế nào đi

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

  1. Phân biệt giữa mô hình xử lý dùng multithread và dùng nhiều process.
    Gửi bởi Cpro trong diễn đàn Windows API, Hooking, xử lý Windows Message
    Trả lời: 8
    Bài viết cuối: 23-02-2013, 10:48 AM
  2. Lập trình C++0x dùng multithread để nhân 2 ma trận
    Gửi bởi nguyentranduy trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 3
    Bài viết cuối: 25-11-2012, 10:09 PM
  3. Algorithm Sử dụng Multithread , ứng dụng bị treo . Cần giúp đỡ .
    Gửi bởi nghich3 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 4
    Bài viết cuối: 13-01-2012, 05:57 PM
  4. Dùng MultiThread để dữ liệu ghi lên file?
    Gửi bởi tdat00 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 17
    Bài viết cuối: 04-07-2009, 01:38 PM
  5. Phân biệt giữa mô hình xử lý dùng multithread và dùng nhiều process.
    Gửi bởi Cpro trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 6
    Bài viết cuối: 24-01-2009, 09:00 PM

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