線程結(jié)束后利用委托生成事件返回,線程應(yīng)用包括傳入和傳出參數(shù)。

創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供東安網(wǎng)站建設(shè)、東安做網(wǎng)站、東安網(wǎng)站設(shè)計(jì)、東安網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、東安企業(yè)網(wǎng)站模板建站服務(wù),10多年東安做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
Public Delegate Sub ThreadCallback(value As ThreadResult)
Public Class Form1
Private WithEvents _th_1 As Thread_1
Protected Overrides Sub OnLoad(e As System.EventArgs)
Dim value As ThreadObject
value.Index = 1
Me._th_1 = New Thread_1(Me)
Me._th_1.Run(value)
MyBase.OnLoad(e)
End Sub
Private Sub Thread_1_End(sender As Object, e As ThreadEventArgs) Handles _th_1.ThreadEnd
Me.TextBox1.Text = e.Result.Text
End Sub
End Class
Public Class Thread_1
Public Event ThreadEnd(sender As Object, e As ThreadEventArgs)
Private _control As Control
Sub New(control As Control)
Me._control = control
End Sub
Public Sub Run(value As Object)
Dim th As New Threading.Thread(AddressOf ThreadProc)
th.Start(value)
End Sub
Private Sub ThreadProc(obj As Object)
Dim value As ThreadObject = CType(obj, ThreadObject)
Dim result As ThreadResult = Nothing
If value.Index = 1 Then result.Text = "測(cè)試"
Dim callback As New ThreadCallback(AddressOf ThreadInvoke)
_control.Invoke(callback, result)
End Sub
Private Sub ThreadInvoke(value As ThreadResult)
RaiseEvent ThreadEnd(Me, New ThreadEventArgs(value))
End Sub
End Class
Public Structure ThreadObject
Public Index As Integer
'Public Rect As Rectangle
End Structure
Public Structure ThreadResult
Public Text As String
'Public Rect As Rectangle
End Structure
Public Class ThreadEventArgs
Inherits System.EventArgs
Private _result As ThreadResult
Public ReadOnly Property Result As ThreadResult
Get
Return _result
End Get
End Property
Sub New(value As ThreadResult)
Me._result = value
End Sub
End Class
public static string getXmlFile(String url, String paramList,string referer)
{
HttpWebResponse res = null;
string strResult = " ";
try
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "GET ";
req.KeepAlive = true;
req.Referer=referer;
//CookieContainer cookieCon = new CookieContainer();
//req.CookieContainer = cookieCon;
//req.CookieContainer.SetCookies(new Uri(url),cookieheader);
StringBuilder UrlEncoded = new StringBuilder();
res = (HttpWebResponse)req.GetResponse();
Stream ReceiveStream = res.GetResponseStream();
Encoding encode = System.Text.Encoding.GetEncoding( "gb2312 ");
StreamReader sr = new StreamReader( ReceiveStream, encode );
Char[] read = new Char[256];
int count = sr.Read( read, 0, 256 );
while (count 0)
{
String str = new String(read, 0, count);
strResult += str;
count = sr.Read(read, 0, 256);
}
}
catch(Exception e)
{
strResult = e.ToString();
}
finally
{
if ( res != null )
{
res.Close();
}
}
return strResult;
}
多線程里調(diào)用就行了 費(fèi)了好長(zhǎng)時(shí)間才弄出來(lái) 我調(diào)試過(guò)了 能行 如果對(duì)你有用就給分吧
vb6可以實(shí)現(xiàn)多線程,不過(guò)比較麻煩,vb.net完全支持多線程,請(qǐng)參見(jiàn)msdn.
至于vb6實(shí)現(xiàn)多線程請(qǐng)看CreateThread這個(gè)API函數(shù).以下有詳細(xì)方案:
用VB寫(xiě)多線程程序用到的第一個(gè)API函數(shù)是CreateThread,這個(gè)函數(shù)的聲明如下:
Private Declare Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadId As Long)As Long
這個(gè)函數(shù)的返回值是線程的句柄,它的參數(shù)含義如下:
1.lpThreadAttributes:這個(gè)參數(shù)表明函數(shù)的返回句柄是否可被子進(jìn)程繼承,如果可被繼承,則指向一個(gè)SECURITY_ATTRIBUTES的結(jié)構(gòu),否則設(shè)為vbnull。
2.dwStackSize:這個(gè)參數(shù)設(shè)置線程的堆棧大小。
3.lpStartAddress:這個(gè)參數(shù)指明這個(gè)線程函數(shù)的起始地址。
4.lpParameter:這個(gè)參數(shù)是傳給線程函數(shù)的參數(shù)。
5.dwCreationFlags:這個(gè)參數(shù)設(shè)置當(dāng)線程創(chuàng)建時(shí)的初始狀態(tài),掛起,運(yùn)行等等。
6.lpThreadId:這個(gè)參數(shù)是待創(chuàng)建線程的ID號(hào)。
假設(shè)創(chuàng)建一個(gè)管理線程的類clsThreads,用類的一個(gè)公用函數(shù)Initialize來(lái)初始化線程,用ResumeThread和SuspendThread函數(shù)來(lái)激活線程,實(shí)現(xiàn)代碼如下:
Private Type udtThread
Handle As Long
Enabled As Boolean
End Type
Private uThread As udtThread
Private Const CREATE_SUSPENDED As Long = H4
Private Declare Function CreateThread Lib "kernel32" (ByVal lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadId As Long) As Long
Private Declare Function ResumeThread Lib "kernel32" (ByVal hThread As Long) As Long
Private Declare Function SuspendThread Lib "kernel32" (ByVal hThread As Long) As Long
Private Declare Function TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long
Public Sub Initialize(ByVal lpfnBasFunc As Long) '初始化線程
Dim lStackSize As Long, lCreationFlags As Long, lpThreadId As Long, lNull As Long
On Error Resume Next
lNull = 0 '創(chuàng)建一個(gè)空指針
lStackSize = 0 '0表示用exe的stack size
lCreationFlags = CREATE_SUSPENDED '表示初始化后先不激活,讓別人來(lái)激活
uThread.Handle = CreateThread(lNull, lStackSize, lpfnBasFunc, lNull, lCreationFlags, lpThreadId)
If uThread.Handle = lNull Then MsgBox "Create thread failed!"
End Sub
Public Property Get Enabled() As Boolean
On Error Resume Next
Enabled = uThread.Enabled
End Property
Public Property Let Enabled(ByVal vNewValue As Boolean)
On Error Resume Next
If vNewValue And (Not uThread.Enabled) Then
ResumeThread uThread.Handle '激活線程
uThread.Enabled = True
ElseIf uThread.Enabled Then
SuspendThread uThread.Handle
uThread.Enabled = False
End If
End Property
Private Sub Class_Terminate() '終止線程
On Error Resume Next
Call TerminateThread(uThread.Handle, 0)
End Sub
以上內(nèi)容在類模塊clsThreads中,有了它就可以在窗體中實(shí)現(xiàn)多線程了。下面以一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明如何創(chuàng)建多線程(以2個(gè)線程為例)。
在form1中添加picture1和picture2兩個(gè)圖片框,以及一個(gè)command1按鈕,在工程中添加一個(gè)bas模塊,該模塊的代碼如下:
Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long
Public Sub FlickerTop()
Static BgColor As Long
Dim lTick As Long, lCounter As Long
On Error Resume Next
For lCounter = 0 To 60000
BgColor = lCounter Mod 256
Form1.Picture1.BackColor = RGB(BgColor, 0, 0) '變化圖片框的顏色
lTick = GetTickCount
While GetTickCount - lTick 10 '延遲10個(gè)毫秒時(shí)間
Wend
Next
End Sub
Public Sub FlickerBottom()
Static BgColor As Long
Dim lTick As Long, lCounter As Long
On Error Resume Next
For lCounter = 0 To 60000
BgColor = lCounter Mod 256
Form1.Picture2.BackColor = RGB(0, BgColor, 0)
lTick = GetTickCount
While GetTickCount - lTick 10
Wend
Next
End Sub
最后在form1中用下面的代碼來(lái)創(chuàng)建兩個(gè)線程,
Option Explicit
Public myThreadTop As New clsThreads, myThreadBottom As New clsThreads
Private Sub Command1_Click()
On Error Resume Next
With myThreadTop
.Initialize AddressOf FlickerTop
.Enabled = True
End With
With myThreadBottom
.Initialize AddressOf FlickerBottom
.Enabled = True
End With
MsgBox "看看會(huì)有什么..."
Set myThreadTop = Nothing
Set myThreadBottom = Nothing
End Sub
多線程一般是不推薦用的,因?yàn)榫€程之間如果有共享資源的話會(huì)引起競(jìng)爭(zhēng),需要加鎖處理;而且線程間沒(méi)有時(shí)序關(guān)系,所以你在調(diào)試中可能會(huì)出現(xiàn)異步處理結(jié)束順序與開(kāi)始處理順序不一致的情況(我在調(diào)試中已經(jīng)發(fā)現(xiàn)該問(wèn)題)。
針對(duì)你提出的這個(gè)問(wèn)題,采用了多線程處理,利用的是BackgroundWorker也就是異步處理控件進(jìn)行了處理。
代碼已經(jīng)經(jīng)過(guò)調(diào)試通過(guò)。歡迎交流,如有問(wèn)題,留下QQ或其他聯(lián)系方式。
代碼如下,并附程序截圖。
‘---------------------------------------------------
Imports?System.ComponentModel?'導(dǎo)入異步控件命名空間
Public?Class?Form1
Private?howmany?As?Integer?=?10
Private?AnalysisNumber(0?To?howmany?-?1)?As?BackgroundWorker
Private?Sub?Button1_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?Button1.Click
ListBox1.Items.Clear()
creatNewBackgroundWorker()
addHandle()
startWork()
End?Sub
Private?Sub?creatNewBackgroundWorker()
For?i?As?Integer?=?0?To?AnalysisNumber.Length?-?1
AnalysisNumber(i)?=?New?BackgroundWorker
Next
End?Sub
Private?Sub?addHandle()
For?i?As?Integer?=?0?To?AnalysisNumber.Length?-?1
AddHandler?AnalysisNumber(i).DoWork,?AddressOf?AnalysisNumber_DoWork
AddHandler?AnalysisNumber(i).RunWorkerCompleted,?AddressOf?AnalysisNumber_RunWorkerCompleted
Next
End?Sub
Private?Sub?startWork()
For?i?As?Integer?=?0?To?9
Dim?temp(0?To?9)?As?Integer
For?j?As?Integer?=?1?To?10
temp(j?-?1)?=?10?*?i?+?j
Next
AnalysisNumber(i).RunWorkerAsync(temp)
Next
End?Sub
Private?Sub?AnalysisNumber_DoWork(ByVal?sender?As?Object,?ByVal?e?As?System.ComponentModel.DoWorkEventArgs)
Dim?data?As?Integer()
data?=?CType(e.Argument,?Integer())
Dim?temp?As?Integer
For?i?As?Integer?=?0?To?data.Length?-?1
temp?=?data(i)
data(i)?=?temp?*?temp
Next
e.Result?=?data
End?Sub
Private?Sub?AnalysisNumber_RunWorkerCompleted(ByVal?sender?As?Object,?ByVal?e?As?System.ComponentModel.RunWorkerCompletedEventArgs)
Dim?data?As?Integer()
data?=?CType(e.Result,?Integer())
For?i?As?Integer?=?0?To?data.Length?-?1
ListBox1.Items.Add(data(i))
Next
End?Sub
End?Class
public class threadclass
{
public int a;
public void threadmethod()
{
//use a;
}
}
...
threadclass tc = new ....
tc.a = 10;
Thread t = new ThreadStart(tc.threadmethod);
t.Start
Sub?Main()
Dim?thr?As?New?Thread(AddressOf?循環(huán))
thr.Start("a")
End?Sub
Sub?循環(huán)(a()?As?String)
'這里隨你干什么循環(huán)也行
For?Each?i?As?String?In?a
MsgBox(i)
Next
End?Sub
看懂了吧 參數(shù)只能有一個(gè) 也可以不是數(shù)組,在a() As String的a后面去掉括號(hào)就行
新聞標(biāo)題:vb.net多線程傳參數(shù),c多線程傳遞參數(shù)
當(dāng)前URL:http://chinadenli.net/article10/dsgjego.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、網(wǎng)站設(shè)計(jì)公司、定制開(kāi)發(fā)、建站公司、品牌網(wǎng)站制作、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)