75 lines
2.0 KiB
Plaintext
75 lines
2.0 KiB
Plaintext
Module Module1
|
|
|
|
Sub Main()
|
|
Using active As New Integrator
|
|
active.Operation = Function(t As Double) Math.Sin(2 * Math.PI * 0.5 * t)
|
|
Threading.Thread.Sleep(TimeSpan.FromSeconds(2))
|
|
Console.WriteLine(active.Value)
|
|
active.Operation = Function(t As Double) 0
|
|
Threading.Thread.Sleep(TimeSpan.FromSeconds(0.5))
|
|
Console.WriteLine(active.Value)
|
|
End Using
|
|
Console.ReadLine()
|
|
End Sub
|
|
|
|
End Module
|
|
|
|
Class Integrator
|
|
Implements IDisposable
|
|
|
|
Private m_Operation As Func(Of Double, Double)
|
|
Private m_Disposed As Boolean
|
|
Private m_SyncRoot As New Object
|
|
Private m_Value As Double
|
|
|
|
Public Sub New()
|
|
m_Operation = Function(void) 0.0
|
|
Dim t As New Threading.Thread(AddressOf MainLoop)
|
|
t.Start()
|
|
End Sub
|
|
|
|
Private Sub MainLoop()
|
|
Dim epoch = Now
|
|
Dim t0 = 0.0
|
|
Do
|
|
SyncLock m_SyncRoot
|
|
Dim t1 = (Now - epoch).TotalSeconds
|
|
m_Value = m_Value + (Operation(t1) + Operation(t0)) * (t1 - t0) / 2
|
|
t0 = t1
|
|
End SyncLock
|
|
Threading.Thread.Sleep(10)
|
|
Loop Until m_Disposed
|
|
End Sub
|
|
|
|
Public Property Operation() As Func(Of Double, Double)
|
|
Get
|
|
SyncLock m_SyncRoot
|
|
Return m_Operation
|
|
End SyncLock
|
|
End Get
|
|
Set(ByVal value As Func(Of Double, Double))
|
|
SyncLock m_SyncRoot
|
|
m_Operation = value
|
|
End SyncLock
|
|
End Set
|
|
End Property
|
|
|
|
Public ReadOnly Property Value() As Double
|
|
Get
|
|
SyncLock m_SyncRoot
|
|
Return m_Value
|
|
End SyncLock
|
|
End Get
|
|
End Property
|
|
|
|
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
|
|
m_Disposed = True
|
|
End Sub
|
|
|
|
Public Sub Dispose() Implements IDisposable.Dispose
|
|
Dispose(True)
|
|
GC.SuppressFinalize(Me)
|
|
End Sub
|
|
|
|
End Class
|