• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

MultiThread có tham số

Các mẹo vặt linh tinh không thuộc các nhóm trên

Điều hành viên: tungcan5diop, QUANITGROBEST

Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

MultiThread có tham số

Gửi bàigửi bởi vo_minhdat2007 » T.Hai 13/09/2010 10:59 am

Thủ thuật: MultiThread có tham số
Tác giả: vo_minhdat2007
Mô tả: Sử dụng Multithread có truyền tham số cho hàm/thủ tục



Như ta đã biết, multi-thread (đa luồng) là một công nghệ khá phổ biến hiện nay và có nhiều ứng dụng hiệu quả! Thế mạnh multithread của .NET thì không cần bàn đến, nhưng lại có một nhược điểm: AddressOf lại không cho phép truyền tham số! Dưới đây mình xin trình bày cách sử dụng multithread thông qua trung gian Delegate để có thể truyền tham số vào các hàm, thủ tục dùng multithread. Điều này đặc biệt hữu ích khi dùng đệ qui!

Trước hết, tạo một class mới (ở đây tên là MultiThread), giả sử trong bài này mình có 1 tham số duy nhất kiểu Integer (tên là Value):

  1. Imports System.Threading
  2.  
  3. Public NotInheritable Class clsMultiThread
  4.  
  5.     Delegate Sub Write(ByVal Value As String)
  6.  
  7.     Class clsArgs
  8.         Public Value As Integer
  9.         Public Work As Write
  10.  
  11.         Sub New(ByVal sValue As Integer)
  12.             Value = sValue
  13.         End Sub
  14.  
  15.         Sub Start()
  16.             Work(Value)
  17.         End Sub
  18.  
  19.     End Class
  20.  
  21.     Public Shared Function CreateThread(ByVal Work As Write, ByVal Value As Integer) As Thread
  22.         Dim Args As New clsArgs(Value)
  23.         Args.Work = Work
  24.         Return New Thread(AddressOf Args.Start)
  25.     End Function
  26.  
  27. End Class
  28.  


Như bạn thấy, thông qua Delegate, ta có thể gọi một thủ tục và hàm, rồi trả về Thread! Đây là chương trình chính của mình:

  1. Imports System.Threading
  2.  
  3. Module mdlGeneral
  4.  
  5.     Sub WriteValue(ByVal Max As Integer)
  6.         For i As Integer = 0 To Max
  7.             Console.WriteLine(i)
  8.         Next
  9.     End Sub
  10.  
  11.     Sub StartThread(ByVal Value As Integer)
  12.         Dim T As Thread = clsMultiThread.CreateThread(AddressOf WriteValue, Value)
  13.         T.Start()
  14.     End Sub
  15.  
  16.     Sub Main()
  17.         Console.Clear()
  18.         StartThread(10)
  19.         StartThread(11)
  20.         StartThread(12)
  21.         Console.ReadKey()
  22.     End Sub
  23.  
  24. End Module
  25.  


Nhiệm vụ của WriteValue là viết các số từ 0 đến Max (tham số Max tương đương tham số Value của các thủ tục khác). Đây là kết quả ;)

Hình ảnh



Hình đại diện của người dùng
Kasper
Guru
Guru
Bài viết: 1062
Ngày tham gia: T.Sáu 16/05/2008 10:54 am
Has thanked: 2 time
Been thanked: 76 time
Liên hệ:

Re: MultiThread có tham số

Gửi bàigửi bởi Kasper » T.Hai 13/09/2010 11:42 am

Rất hay. Đạt có biết cách nào sử dụng multithread làm việc với control không?
Lành tợ tòng, ác tợ hoa,
Nhà hòa muôn việc đều nên.

Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

Re: MultiThread có tham số

Gửi bàigửi bởi vo_minhdat2007 » T.Hai 13/09/2010 1:16 pm

Cái đó đúng là khó chịu thật :D Có bài này bên C Việt, em chưa test được, anh xem thử đi: http://forums.congdongcviet.com/showthread.php?t=5794

Hình đại diện của người dùng
Kasper
Guru
Guru
Bài viết: 1062
Ngày tham gia: T.Sáu 16/05/2008 10:54 am
Has thanked: 2 time
Been thanked: 76 time
Liên hệ:

Re: MultiThread có tham số

Gửi bàigửi bởi Kasper » T.Ba 14/09/2010 9:47 am

Đã test thử link của Đạt, xử lý được multithread với control, nhưng nó không làm song song. Nghĩa là nó chạy hết thread 1 rồi mới đến thread 2, hoặc hết thread 2 rồi mới làm thread 1
Lành tợ tòng, ác tợ hoa,
Nhà hòa muôn việc đều nên.

Hình đại diện của người dùng
PhapSuXeko
Mạnh Thường Quân
Mạnh Thường Quân
Bài viết: 295
Ngày tham gia: CN 03/05/2009 7:44 pm
Đến từ: Tây Ninh
Has thanked: 1 time
Been thanked: 10 time
Liên hệ:

Re: MultiThread có tham số

Gửi bàigửi bởi PhapSuXeko » T.Ba 14/09/2010 12:44 pm

Kasper đã viết:Rất hay. Đạt có biết cách nào sử dụng multithread làm việc với control không?

Xem bài của anh Kỳ Nam nhé: viewtopic.php?f=23&t=334&start=0&hilit=cross+thread
Trang chủ phần mềm xem ảnh ImageGlass: http://www.imageglass.org

Hình đại diện của người dùng
lungocqua
Guru
Guru
Bài viết: 1225
Ngày tham gia: T.Ba 18/08/2009 11:51 am
Đến từ: Phú Hữu - Nhơn Trạch - Đồng Nai
Been thanked: 5 time
Liên hệ:

Re: MultiThread có tham số

Gửi bàigửi bởi lungocqua » T.Ba 14/09/2010 4:25 pm

Vậy có cách nào làm cho hai thread cùng lúc hay không? Nếu dùng CPU đa nhân thì sao? Nó có chia ra thread này sẽ chạy nhân này còn thread kia chạy nhân kia? :-/
Ta đã trở lại và quên hết tất cả! :D

Hình đại diện của người dùng
bangnhatquang68
Guru
Guru
Bài viết: 791
Ngày tham gia: T.Ba 26/01/2010 12:44 pm
Đến từ: Vĩ tuyến 17
Has thanked: 20 time
Been thanked: 37 time
Liên hệ:

Re: MultiThread có tham số

Gửi bàigửi bởi bangnhatquang68 » T.Ba 14/09/2010 7:54 pm

thread - phân luồng hiểu đại khái thế thôi.
hiện tại tôi vẫn rất búi tờ mờ về cái phân luông này.
cách dùng nó thế nào có bài nào hướng dẫn một cách tổng quan da chiều hơn không.
MultiThread quả thật không hiểu và không biét dùng nó vào vb.net ở đoạn nào.
dọc trên mạng nhưng không hiểu.. :(
Mời anh em lên facebook giao lưu nào!
http://www.facebook.com/groups/145823032176611/

Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

Re: MultiThread có tham số

Gửi bàigửi bởi vo_minhdat2007 » T.Ba 14/09/2010 9:59 pm

Cảm ơn PhapSuXeko nha ;)


Quay về “[.NET] Mẹo vặt khác”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách