• 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

Moderators: tungcan5diop, QUANITGROBEST

User avatar
vo_minhdat2007
Quản trị
Quản trị
Posts: 2227
Joined: Sun 17/07/2005 1:40 am
Has thanked: 13 times
Been thanked: 87 times
Contact:

MultiThread có tham số

Postby vo_minhdat2007 » Mon 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:

[vbnet]Imports System.Threading

Module mdlGeneral

Sub WriteValue(ByVal Max As Integer)
For i As Integer = 0 To Max
Console.WriteLine(i)
Next
End Sub

Sub StartThread(ByVal Value As Integer)
Dim T As Thread = clsMultiThread.CreateThread(AddressOf WriteValue, Value)
T.Start()
End Sub

Sub Main()
Console.Clear()
StartThread(10)
StartThread(11)
StartThread(12)
Console.ReadKey()
End Sub

End Module
[/vbnet]

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ả ;)

Image



User avatar
Kasper
Guru
Guru
Posts: 1063
Joined: Fri 16/05/2008 10:54 am
Has thanked: 2 times
Been thanked: 76 times
Contact:

Re: MultiThread có tham số

Postby Kasper » Mon 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.

User avatar
vo_minhdat2007
Quản trị
Quản trị
Posts: 2227
Joined: Sun 17/07/2005 1:40 am
Has thanked: 13 times
Been thanked: 87 times
Contact:

Re: MultiThread có tham số

Postby vo_minhdat2007 » Mon 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

User avatar
Kasper
Guru
Guru
Posts: 1063
Joined: Fri 16/05/2008 10:54 am
Has thanked: 2 times
Been thanked: 76 times
Contact:

Re: MultiThread có tham số

Postby Kasper » Tue 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.

User avatar
PhapSuXeko
Mạnh Thường Quân
Mạnh Thường Quân
Posts: 295
Joined: Sun 03/05/2009 7:44 pm
Location: Tây Ninh
Has thanked: 1 time
Been thanked: 10 times
Contact:

Re: MultiThread có tham số

Postby PhapSuXeko » Tue 14/09/2010 12:44 pm

Kasper wrote: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

User avatar
lungocqua
Guru
Guru
Posts: 1225
Joined: Tue 18/08/2009 11:51 am
Location: Phú Hữu - Nhơn Trạch - Đồng Nai
Been thanked: 5 times
Contact:

Re: MultiThread có tham số

Postby lungocqua » Tue 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

User avatar
bangnhatquang68
Guru
Guru
Posts: 791
Joined: Tue 26/01/2010 12:44 pm
Location: Vĩ tuyến 17
Has thanked: 20 times
Been thanked: 38 times
Contact:

Re: MultiThread có tham số

Postby bangnhatquang68 » Tue 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/

User avatar
vo_minhdat2007
Quản trị
Quản trị
Posts: 2227
Joined: Sun 17/07/2005 1:40 am
Has thanked: 13 times
Been thanked: 87 times
Contact:

Re: MultiThread có tham số

Postby vo_minhdat2007 » Tue 14/09/2010 9:59 pm

Cảm ơn PhapSuXeko nha ;)


Return to “[.NET] Mẹo vặt khác”

Who is online

Users browsing this forum: No registered users and 0 guests