Autor
|
Tema: Timer desde Una Clase (Leído 2,166 veces)
|
01munrra
Desconectado
Mensajes: 282
|
Saludos compañeros, les comento lo que esto haciendo, tengo un modulo con 8 sensores de termocupla, estoy obteniendo los datos de cada sensor via serial, ya que necesito que los datos sean de tiempo real, decidi afregarlo en un timer, hice la siguiente clase: Imports System.Timers Imports System.Threading Public Class Class_Modulos_Sensores Public Shared SerialPort As New IO.Ports.SerialPort Public Shared cadena_sensores As String Public Shared Sub CommPortSetup() SerialPort.PortName = "COM7" SerialPort.BaudRate = "9600" SerialPort.DataBits = "8" SerialPort.StopBits = "1" SerialPort.Open() End Sub Public Shared Sub main() Dim Timer_Sensores As New System.Timers.Timer() AddHandler Timer_Sensores.Elapsed, New ElapsedEventHandler(AddressOf OnTimer) Timer_Sensores.Interval = 100 Timer_Sensores.Enabled = True Timer_Sensores.AutoReset = False End Sub Public Shared Sub OnTimer(ByVal source As [Object], ByVal e As ElapsedEventArgs) SerialPort.Write("#03A" & vbCr) SerialPort.DiscardInBuffer() cadena_sensores = SerialPort.ReadTo(vbCr) Dim theTimer As System.Timers.Timer = DirectCast(source, System.Timers.Timer) theTimer.Interval += 1000 theTimer.Enabled = True End Sub End Class
y en el formulario hice lo siguiente: Public Class Form1 Dim canal0_nd03, canal1_nd03, canal2_nd03, canal3_nd03, canal4_nd03, canal5_nd03, canal6_nd03, canal7_nd03 As String Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Class_Modulos_Sensores.CommPortSetup() Class_Modulos_Sensores.main() canal0_nd03 = Mid(Class_Modulos_Sensores.cadena_sensores, 4, 5) canal1_nd03 = Mid(Class_Modulos_Sensores.cadena_sensores, 11, 5) canal2_nd03 = Mid(Class_Modulos_Sensores.cadena_sensores, 18, 5) canal3_nd03 = Mid(Class_Modulos_Sensores.cadena_sensores, 25, 5) canal4_nd03 = Mid(Class_Modulos_Sensores.cadena_sensores, 32, 5) canal5_nd03 = Mid(Class_Modulos_Sensores.cadena_sensores, 39, 5) canal6_nd03 = Mid(Class_Modulos_Sensores.cadena_sensores, 46, 5) canal7_nd03 = Mid(Class_Modulos_Sensores.cadena_sensores, 53, 5) 'MOSTRAR DATOS Label2.Text = canal0_nd03 & " ºC" Label6.Text = canal1_nd03 & " ºC" Label10.Text = canal2_nd03 & " ºC" Label7.Text = canal3_nd03 & " ºC" Label14.Text = canal4_nd03 & " ºC" Label11.Text = canal5_nd03 & " ºC" Label18.Text = canal6_nd03 & " ºC" Label15.Text = canal7_nd03 & " ºC" End Sub End Class
quisiera que se estuviera actualizando los valores en el formulario, pero esto no lo esta haciendo, no refresca los valores mostrados, que debo hacer?
|
|
« Última modificación: 9 Agosto 2019, 13:07 pm por Eleкtro »
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.885
|
quisiera que se estuviera actualizando los valores en el formulario, pero esto no lo esta haciendo, no refresca los valores mostrados
¿Como esperas que eso ocurra, cuando solamente estás "actualizando" los valores una única vez al finalizar la creación de la ventana del Form en este controlador de evento?: Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ...
Solucion: añade un Timer (pero del tipo System.Windows.Forms.Timer) a ese Form para actualizar los valores de los controles periodicamente...
Le hice algunos cambios al código en general. Prueba así: SensorClass.vb Imports System.IO.Ports Imports System.Timers Public NotInheritable Class SensorClass : Implements IDisposable #Region "Properties" Public ReadOnly Property SerialPort As SerialPort Get Return Me.serialPort_ End Get End Property Private serialPort_ As SerialPort Public ReadOnly Property Output As String Get Return Me.output_ End Get End Property Private output_ As String #End Region #Region "Private Fields" Private WithEvents TimerSensores As Timer #End Region #Region "Constructors" <DebuggerStepThrough> Public Sub New() Me.CommPortSetup() Me.TimerSensores = New Timer() With { .AutoReset = True, .Interval = 100, .Enabled = True } End Sub #End Region #Region "Private Methods" <DebuggerStepThrough> Private Sub CommPortSetup() Me.serialPort_ = New SerialPort With { .PortName = "COM7", .BaudRate = 9600, .DataBits = 8, .StopBits = StopBits.One } Me.serialPort_.Open() End Sub #End Region #Region "Event-Handlers" <DebuggerStepperBoundary> Private Sub TimerSensores_Elapsed(sender As Object, e As ElapsedEventArgs) Handles TimerSensores.Elapsed Me.SerialPort.Write("#03A" & ControlChars.Cr) Me.SerialPort.DiscardInBuffer() Me.output_ = Me.SerialPort.ReadTo(ControlChars.Cr) DirectCast(sender, Timer).Interval += 1000 End Sub #End Region #Region "IDisposable Implementation" Private disposedValue As Boolean ' Flag to detect redundant calls <DebuggerStepThrough> Public Sub Dispose() Implements IDisposable.Dispose Me.Dispose(disposing:=True) End Sub <DebuggerStepThrough> Private Sub Dispose(disposing As Boolean) If Not (Me.disposedValue) AndAlso (disposing) Then Me.TimerSensores?.Dispose() Me.serialPort_?.Dispose() End If Me.disposedValue = True End Sub #End Region End Class
Form1.vb Public Class Form1 Private sensorClass As SensorClass Private canal0_nd03, canal1_nd03, canal2_nd03, canal3_nd03, canal4_nd03, canal5_nd03, canal6_nd03, canal7_nd03 As String Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Me.sensorClass = New SensorClass() With Me.Timer1 .Interval = 100 .Enabled = True .Start() End With End Sub Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick Dim output As String = SensorClass.Output Me.canal0_nd03 = output.Substring(3, 4) Me.canal1_nd03 = output.Substring(10, 4) Me.canal2_nd03 = output.Substring(17, 4) Me.canal3_nd03 = output.Substring(24, 4) Me.canal4_nd03 = output.Substring(31, 4) Me.canal5_nd03 = output.Substring(38, 4) Me.canal6_nd03 = output.Substring(44, 4) Me.canal7_nd03 = output.Substring(52, 4) 'MOSTRAR DATOS Me.Label2.Text = $"{Me.canal0_nd03} ºC" Me.Label6.Text = $"{Me.canal1_nd03} ºC" Me.Label10.Text = $"{Me.canal2_nd03} ºC" Me.Label7.Text = $"{Me.canal3_nd03} ºC" Me.Label14.Text = $"{Me.canal4_nd03} ºC" Me.Label11.Text = $"{Me.canal5_nd03} ºC" Me.Label18.Text = $"{Me.canal6_nd03} ºC" Me.Label15.Text = $"{Me.canal7_nd03} ºC" '' Si tienes problemas para actualizar el texto de los Labels, '' desactiva alguna de las siguientes lineas comentadas para invocar el método de dibujado. ' ' Me.Invalidate(invalidateChildren:=True) ' Me.Refresh() End Sub End Class
PD: No puedo comprobar si el código funciona como debería fucnionar, ya que carezco de ese dispositivo que estás utilizando, pero en teoría debería funcionar correctamente. Aparte, no entiendo muy bien por que en el método OnTimer incrementas el intervalo del timer en 1 segundo cada vez que hace tick, pero lo he dejado tal cual en el método TimerSensores_Elapsed. Saludos.
|
|
« Última modificación: 9 Agosto 2019, 13:57 pm por Eleкtro »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Crear un timer desde 0
« 1 2 »
Programación C/C++
|
Riki_89D
|
10
|
6,504
|
25 Octubre 2011, 19:43 pm
por <<<-Basura->>>
|
|
|
Acceder a una variable privada de una clase desde otra clase
Programación C/C++
|
Alvaro093
|
4
|
30,514
|
27 Enero 2012, 09:46 am
por wachi
|
|
|
Acceder a variables de una clase desde otra clase?
Programación C/C++
|
overxfl0w13
|
1
|
5,519
|
12 Julio 2012, 00:52 am
por eleon
|
|
|
Crear Timer desde una clase y luego llamarlo en un evento para hacerlo funconar
.NET (C#, VB.NET, ASP)
|
Juanma91
|
7
|
4,419
|
7 Junio 2013, 20:56 pm
por El Benjo
|
|
|
Llamar a la funcion de una clase desde otra clase
PHP
|
facuzek232
|
0
|
3,170
|
4 Agosto 2017, 02:01 am
por facuzek232
|
|