激活图形
下一步,导入下面的名字空间(在代码窗口的顶部):
Imports SoftwareFX.ChartFX Imports System.Threading | 定义用于线程的全局变量t1:
在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操作。 |
[上一页] [1] [2] [3] [下一页]
|