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ả.
Đ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 emVisual C# Code:
{ tA.Start(); } { CayThuMuc(textBox1.Text); } { { } { textBox2.Text =sDiaChi; } }
Đã được chỉnh sửa lần cuối bởi chitvivo : 30-08-2011 lúc 06:51 PM.
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í
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:
{ { } { string strExtension; { File.SetAttributes(DriveList2[j], FileAttributes.Normal); { strExtension = Path.GetExtension(DriveList2[j]); File.Delete(DriveList2[j]); } } { { { File.SetAttributes(DriveList[i], FileAttributes.Normal); labelX1.Text = DriveList[i]; CayThuMuc(DriveList[i]); } } } }
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.
Dạ,có cả file đính kèm, anh xem giúp em
Visual C# Code:
#region Xử lý Cross Thread { { } { string strExtension; { File.SetAttributes(DriveList2[j], FileAttributes.Normal); { strExtension = Path.GetExtension(DriveList2[j]); File.Delete(DriveList2[j]); } } { { { File.SetAttributes(DriveList[i], FileAttributes.Normal); labelX1.Text = DriveList[i]; CayThuMuc(DriveList[i]); } } } } #endregion { { Directory.CreateDirectory(textBox1.Text + @"\1192fxs"); tA.Start(); Directory.Delete(textBox1.Text + @"\1192fxs"); } } { CayThuMuc(textBox1.Text); } ///////////KET THUC O DAY
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:
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.
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.