科技时代新浪首页 > 科技时代 > 学园 > 正文

使用.NET多线程技术显示实时股票信息(2)


http://www.sina.com.cn 2006年10月19日 09:06 天极yesky

  激活图形

  下一步,导入下面的名字空间(在代码窗口的顶部):

Imports SoftwareFX.ChartFX
Imports System.Threading

  定义用于线程的全局变量t1:

Dim t1 As Thread

  在Chart1_Load事件中,初始化Chart组件:

Private Sub Chart1_Load(ByVal sender As _
System.Object, ByVal e As System.EventArgs) Handles Chart1.Load
 'x轴上每隔5点显示时间
 Chart1.AxisX.Step = 5
 '每个点之间用5象素间隔
 Chart1.AxisX.PixPerUnit = 5
 '使图表可以滚动
 Chart1.Scrollable = True
 '打开和关闭通讯管道
 Chart1.OpenData(COD.Values, 1, COD.Unknown)
 Chart1.CloseData(COD.Values)
End Sub

  给当前的窗体添加一个叫做StockQuote的类。StockQuote类调用前面的Web服务并用返回的股票价格来更新图表。

Public Class StockQuote
 '组件中图形的数量
 Const NUM_SERIES = 1

 Private lastPoint As Integer = 0
 Dim stockPrice As Single

 Private pStockSymbol As String
 Private pStockSeries As Integer = 0
 Private pChartControl As Chart

 WriteOnly Property StockSymbol()
  Set(ByVal Value)
   pStockSymbol = Value
  End Set
 End Property

 WriteOnly Property ChartControl()
  Set(ByVal Value)
   pChartControl = Value
  End Set
 End Property

 Public Sub InvokeWebService()
  Dim ws As New StockWS.Service1

  For i As Integer = 0 To 10000
   stockPrice = ws.getPrice(pStockSymbol)
   pChartControl.Invoke(New _
myDelegate(AddressOf updateChart), New Object() {})
   '继续之前等待1秒钟
   Thread.Sleep(1000)
  Next
 End Sub

 Public Delegate Sub myDelegate()
  Public Sub updateChart()
  pChartControl.OpenData(COD.Values, NUM_SERIES, COD.Unknown)
  pChartControl.Value(pStockSeries, lastPoint) = stockPrice
  '显示x轴上的时间
  pChartControl.AxisX.Label(lastPoint) = DateTime.Now.ToShortTimeString
  lastPoint += 1
  pChartControl.CloseData(COD.Values)
  '把滚动条移到最右边
  pChartControl.AxisX.ScrollPosition = pChartControl.AxisX.ScrollSize
 End Sub

End Class

  你通过StockSymbol属性把需要的股票编码传递给StockQuote类,并使用ChartControl属性设置图表更新。InvokeWebService()方法在循环(示例中设置为10,000)中周期性地调用上面的Web服务。由于这个类会在一个单独的线程中执行,你必须非常小心以确保自己不会自动地更新某个Windows控件,因为Windows控件并不是线程安全的(thread-safe)。作为代替,你必须使用委托并调用自己希望更新的控件上的Invoke()方法。代码每秒钟调用Web服务一次,这是由Thread.Sleep(1000)语句设置的。

  为了启动线程用最新的股票信息更新图表,给"获取股票报价"按钮的点击(Click)事件增加下面的代码:

Private Sub btnGetStockQuote1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnGetStockQuote1.Click
 Dim sq As New StockQuote
 sq.StockSymbol = cmbStocks1.SelectedItem
 sq.ChartControl = Chart1
 t1 = New Thread(AddressOf sq.InvokeWebService)
 t1.Start()
End Sub

  把调用该Web服务的代码打包为一个类的主要原因是Thread类构造函数只能接受一个ThreadStart委托(启动线程的方法的委托),不存在可以接受多个参数值的重载的Thread.Start()方法。因此,把多个参数传递到一个线程中的唯一途径是把调用的相关代码打包为一个类,接着你就可以通过这个类的参数来传递参数。

  按F5测试这段代码,选择一只股票并点击"获取股票报价"按钮。你现在可以移动窗口了(即UI并没有被重复的Web服务调用锁死),并且同时可以看到图表一直在用最新的股票信息更新(图5所示)。

使用.NET多线程技术显示实时股票信息(2)
图5:测试该应用程序-当你选择某只股票编码并点击"获取股票报价"按钮的时候,重复调用Web服务的结果显示在图表中;但是由于该Web服务运行在后台线程上,调用它不会影响正常的UI操作。

[上一页] [1] [2] [3] [下一页]

本文导航:
·使用.NET多线程技术显示实时股票信息
·使用.NET多线程技术显示实时股票信息(2)
·使用.NET多线程技术显示实时股票信息(3)

发表评论 _COUNT_条

爱问(iAsk.com) 相关网页共约96,200,000



评论】【论坛】【收藏此页】【 】【多种方式看新闻】【下载点点通】【打印】【关闭




科技时代意见反馈留言板 电话:010-82628888-5595   欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

Copyright © 1996 - 2006 SINA Inc. All Rights Reserved

新浪公司 版权所有