PDA

Ver la versión completa : vb2008 problema con timer y otros



1fluke2
26-04-2010, 12:26
hola,
hemos realizado un programa con visual basic 2008 express que realiza el envio de mensajes a un automata y realize la escucha de las respuestas que da el automata.

El problema surge con el timer que hemos introducido, cuando esta realizando la escucha automataica con el periodo de tiempo fijado, con el timer los botones para realizar algun proceso quedan semi bloqueados, es decir, cuando se quiere utilizar algun boton y esta el timer, hay q pulsar repetidas veces hasta que el programa se da cuenta de que se ha pulsado dicho boton.
Mi pregunta es por que se produce este problema y cual es la posible solucion para dicho problema¿?

Ademas, hemos creado una grafica representando los valores de un potenciometro de un automata, y nos interesaria que cuando la grafica llegue a su valor maximo de representacion (a la derecha), haga un scroll, es decir, que vaya deslizando la representacion de la grafica hacia la izquierda y siga representando los valores.

muchas gracias de antemano!

saludos

Marchi
27-04-2010, 03:29
No use nunca vb 2008 y hace rato que no uso vb6, además creo que cambió la implementación del timer, pero supongo que dependiendo como se lo llama, cuando el timer se activa puede detener todo el thread.

Si podés pega el código que les está trayendo problemas.


En cuanto a la segunda pregunta, como han creado la "gráfica"? Se trata de un gif animado o de imágenes que se van actualizando de acuerdo al progreso o periódicamente?


Saludos

Fruit
27-04-2010, 07:27
Lo más normal en estos casos es que mientras un código se está ejecutando, la interfaz no se actualiza, por lo que parece estar 'congelada'. Hay que llamar a una función -la cual no recuerdo- para forzar la actualización.

1fluke2
27-04-2010, 10:35
Esto es parte del codigo

'reloj de tiempo para la escucha continua
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If SerialPort1.IsOpen Then
cadena_recibir = SerialPort1.ReadExisting()
... mucho mas codigo
End If
end sub

Otra gente me ha aconsejado dos cosas diferentes,
1.- usar threads en vez de timer (que no se como funciona)
2.- meter dentro del timer "aplication.doevents" (¿a esto te refieres, Fruit?)

¿que opinais vosotros?

Respecto a la grafica:

'dibujo de la grafica
'declaramos area de dibujo
Dim grafica As Graphics = PictureBox1.CreateGraphics()
'declaramos lapiz
Dim lapiz As New Pen(Color.Black)
grafica.DrawLine(lapiz, puntoX1, puntoY1, puntoX2, puntoY2)

gracias por el interes, muchachos

Marchi
27-04-2010, 11:48
En algun lado tenés que estar llamándolo con un Timer1.start(), después de eso tendrías que poner lo siguiente:


blTimerDurmiendo = True
While blTimerDurmiendo
Application.doevents()
End While


Siendo blTimerDurmiendo una variable booleana (también podría ser un integer o cualquier cosa que permita usarse como booleano).

Cuando se llama a Timer1_tick (por que pasó el tiempo durante el que el timer estuvo durmiendo) ponés blTimerDurmiendo a False y listo.


Saludos

1fluke2
27-04-2010, 12:25
vale, gracias por la respuesta.
Entiendo lo que me dices, y como lo quieres hacer.

Pero el problema, es que:


Private Sub Form1_Load
Timer1.Start()
end sub

Desde que arranca el programa, pone un timer de 10ms, para comprobar el puerto (quizas pueda ponerlo a 100ms, pero no mas tiempo). Y nunca lo paro.
Y claro, yo con ese timer controlo el resto de variables.

¿donde puedo poner que compruebe que esta la variable inventada timerdurmiendo=false?
Ese es mi problema. ¿como hago para que lo haga ciclicamente? A mi se me ocurrio un timer. Pero, ¿que otras opciones tengo? Porque ¿no existe ningun form evento ciclico, verdad?

A ver como discurrimos esto....

saludote

Marchi
27-04-2010, 14:57
Podes llamar a Timer1.start() en el form_load, ahi justo despues del start() ponés el bucle, incluso podés poner todo eso en otro while sin fin, o que tenga otro flag de salida distinto para cuando quieras evitar que se siga ejecutando el Timer.


Private Sub Form1_Load
flag = True
While flag
Timer1.Start()
While blTimer
application.doevents()
End While
End While
end sub



A la hora de salir le pones flag = False justo antes de hacer el Exit


Saludos

Marchi
27-04-2010, 18:39
No había visto lo de la gráfica, pero leyendo el código no me queda muy claro como es que lo hacen. Supongo que dibujan una linea y la van moviendo según el valor del potenciómetro. Lo que no se es si para cambiar el valor del potenciómetro usan un scroll o que.

Explicá un poco mejor esta parte que soy poco ocurrente. :P


Saludos

1fluke2
28-04-2010, 13:10
mmm voy a probarlo.
Gracias por la respuesta.

En cuanto tenga esto, te explico lo de la grafica.

Gracias!!!