科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件使用.NET多线程技术显示实时股票信息

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文的内容是学习如何使用多线程技术建立应用程序,使应用程序在执行时间和资源密集型后台事务的时候,用户界面(UI)仍然保持活动状态。

作者:陶刚编译 来源:天极开发 2007年11月3日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
激活图形

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

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所示)。

点击放大此图片
图5:测试该应用程序-当你选择某只股票编码并点击"获取股票报价"按钮的时候,重复调用Web服务的结果显示在图表中;但是由于该Web服务运行在后台线程上,调用它不会影响正常的UI操作。
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章