使用.NET多线程技术显示实时股票信息(1)
作者: 来源:it167 点击: 日期:2007-01-28 |
|
|
示例项目使用计时器控件(Timer,在工具箱中)来显示第二个线程的状态信息。把计时器拖放到窗体上,并把它的Interval属性设置为500,这使该计时器的Tick事件每半秒钟(500毫秒)调用一次。Tick事件处理程序中的代码更新了标签控件lblThreadStatus中的线程状态信息:
Private Sub Timer1_Tick(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Timer1.Tick
lblThreadStatus.Text = "Thread state: " & _
t2.ThreadState.ToString
End Sub
|
第二个图表也使用与第一个图表相同的初始化代码:
Private Sub Chart2_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Chart2.Load
'在x轴上每5点显示时间
Chart2.AxisX.Step = 5
'每个点之间用5个象素分隔
Chart2.AxisX.PixPerUnit = 5
'使图表可以滚动
Chart2.Scrollable = True
'打开和关闭通讯管道-
Chart2.OpenData(COD.Values, 1, COD.Unknown)
Chart2.CloseData(COD.Values)
End Sub
|
你点击第二个图表的“获取股票报价”按钮的时候,代码建立一个新的线程--同时激活计时器,这样窗体才能够显示线程的状态信息:
Private Sub btnGetStockQuote2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnGetStockQuote2.Click
Dim sq As New StockQuote
sq.StockSymbol = cmbStocks2.SelectedItem
sq.ChartControl = Chart2
t2 = New Thread(AddressOf sq.InvokeWebService)
t2.Start() '激活暂停和停止按钮
btnPauseContinue.Enabled = True
btnStop.Enabled = True
'激活计时器控件
Timer1.Enabled = True
End Sub
|
按F5测试这两个图表(图7所示)。为每个图表选择一只股票,你将看到这两个图表同步显示。

图7:增强的两图表应用程序
增强的版本同时显示了两个图表。
当第二个线程运行的时候,你可以注意到其状态在Running和WaitSleepJoin之间交替。这是因为某个线程要么在执行(Running),要么在睡眠(WaitSleepJoin)。当该线程被暂停的时候,它的状态是WaitSleepJoin、Suspended。当该线程被取消的时候,它的状态先是AbortRequested,接着变成了Stopped。
如果要暂停该线程,需要首先检测运行中线程的状态,然后使用Suspend()方法。在暂停一个线程之后,你可以使用Resume()方法继续执行它。
Private Sub btnPauseContinue_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnPauseContinue.Click
' 如果线程处于睡眠和运行状态就挂起它
If t2.ThreadState = ThreadState.WaitSleepJoin _
Or t2.ThreadState = ThreadState.Running Then
t2.Suspend()
btnPauseContinue.Text = "Continue"
Else
' 继续该线程
t2.Resume()
btnPauseContinue.Text = "Pause"
End If
End Sub
|
停止线程则使用Abort()方法:
Private Sub btnStop_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnStop.Click
Try
If Not t2.ThreadState = ThreadState.Stopped Then
btnPauseContinue.Enabled = False
btnStop.Enabled = False
t2.Abort()
End If
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub
|
通过运行示例项目,你会发现自己已经能够使用多线程技术建立应用程序,使应用程序在执行后台事务的时候,仍然保持响应。尽管本文的示例使用的是Web服务,但是相同的原则也可以应用于其它类型的后台事务。例如,你可以改变这个应用程序以读取外部设备(例如温度计或血压计监视设备)的数据。
(责任编辑 火凤凰 sunsj@51cto.com TEL:(010)68476636-8007)
|