Cola de Mensajes/Procesos

26/09/2008 - 12:07 por jesusR | Informe spam
Hola, les presento la siguiente situación:
Tengo desarrollada una clase (DrvMgr) que se encarga de codificar
cierta información(a traves de un método llamado CodificaComando) y
enviarla a un dispositivo conectado en el puerto serie (a traves de su
método llamado EnviarDato). el dispositivo retorna un comando por el
mismo puerto Serie.

Luego tengo una aplicacion windows que utiliza esta clase para el
envio de estos mensajes.

El problema esta en que requiero hacer una "cola" de mensajes, es
decir, tengo que evitar que sean enviados N mensajes "en el mismo
momento" al dispositivo.
Por ejemplo, la aplicacion de windows realiza lo siguiente:
DrvMgr dm = new DrvMgr();
for (int i = 0; i < 300; i += 1)
{
string comando=dm.CodificaComando(i);
dm.EnviarDato(comando);
System.Threading.Thread.Sleep(2000);
}
en donde dm es la instancia a mi clase que codificará la info y la
envia al puerto COM. BuscaComando codifica y devuelve una cadena de
alrededor de 10 Kb, y por ultimo EnviarDato es el método que enviará
la cadena al dispositivo a través del puerto Serie (COM).

Actualmente incluyo en el código de envío la siguiente instrucción:
System.Threading.Thread.Sleep(2000); esto para evitar que tanto el
puerto del PC como del dispositivo se saturen.

La idea es realmente ir metiendo los mensajes en una cola e irlos
sacando después que el dispositivo emita una respuesta.
Me imagino que sera haciendo algo tipo cola o algo así.

Algún comentario?

Preguntas similare

Leer las respuestas

#1 Item
26/09/2008 - 12:27 | Informe spam
TAD: "Cola de Prioridad"

Si lo pones en Google aparecerá el algoritmo. A cada proceso le asignas una
prioridad y al encolar lo hace ordenando por la prioridad.

Luego desencolas normálmente.

"jesusR" escribió en el mensaje
news:
Hola, les presento la siguiente situación:
Tengo desarrollada una clase (DrvMgr) que se encarga de codificar
cierta información(a traves de un método llamado CodificaComando) y
enviarla a un dispositivo conectado en el puerto serie (a traves de su
método llamado EnviarDato). el dispositivo retorna un comando por el
mismo puerto Serie.

Luego tengo una aplicacion windows que utiliza esta clase para el
envio de estos mensajes.

El problema esta en que requiero hacer una "cola" de mensajes, es
decir, tengo que evitar que sean enviados N mensajes "en el mismo
momento" al dispositivo.
Por ejemplo, la aplicacion de windows realiza lo siguiente:
DrvMgr dm = new DrvMgr();
for (int i = 0; i < 300; i += 1)
{
string comando=dm.CodificaComando(i);
dm.EnviarDato(comando);
System.Threading.Thread.Sleep(2000);
}
en donde dm es la instancia a mi clase que codificará la info y la
envia al puerto COM. BuscaComando codifica y devuelve una cadena de
alrededor de 10 Kb, y por ultimo EnviarDato es el método que enviará
la cadena al dispositivo a través del puerto Serie (COM).

Actualmente incluyo en el código de envío la siguiente instrucción:
System.Threading.Thread.Sleep(2000); esto para evitar que tanto el
puerto del PC como del dispositivo se saturen.

La idea es realmente ir metiendo los mensajes en una cola e irlos
sacando después que el dispositivo emita una respuesta.
Me imagino que sera haciendo algo tipo cola o algo así.

Algún comentario?
Respuesta Responder a este mensaje
#2 jesusR
26/09/2008 - 13:49 | Informe spam
On 26 sep, 12:27, "Item" wrote:
TAD: "Cola de Prioridad"

Si lo pones en Google aparecerá el algoritmo. A cada proceso le asignas una
prioridad y al encolar lo hace ordenando por la prioridad.

Luego desencolas normálmente.

"jesusR" escribió en el mensajenews:
Hola, les presento la siguiente situación:
Tengo desarrollada una clase (DrvMgr) que se encarga de codificar
cierta información(a traves de un método llamado CodificaComando) y
enviarla a un dispositivo conectado en el puerto serie (a traves de su
método llamado EnviarDato). el dispositivo retorna un comando por el
mismo puerto Serie.

Luego tengo una aplicacion windows que utiliza esta clase para el
envio de estos mensajes.

El problema esta en que requiero hacer una "cola" de mensajes, es
decir, tengo que evitar que sean enviados N mensajes "en el mismo
momento" al dispositivo.
Por ejemplo, la aplicacion de windows realiza lo siguiente:
            DrvMgr dm = new DrvMgr();
            for (int i = 0; i < 300; i += 1)
            {
                string comando=dm.CodificaComando(i);
                dm.EnviarDato(comando);
                System.Threading.Thread.Sleep(2000);
            }
en donde dm es la instancia a mi clase que codificará la info y la
envia al puerto COM. BuscaComando codifica y devuelve una cadena de
alrededor de 10 Kb, y por ultimo EnviarDato es el método que enviará
la cadena al dispositivo a través del puerto Serie (COM).

Actualmente incluyo en el código de envío la siguiente instrucción:
System.Threading.Thread.Sleep(2000); esto para evitar que tanto el
puerto del PC como del dispositivo se saturen.

La idea es realmente ir metiendo los mensajes en una cola e irlos
sacando después que el dispositivo emita una respuesta.
Me imagino que sera haciendo algo tipo cola o algo así.

Algún comentario?



Item, gracias por tu pronta respuesta.
Con la información que me has facilitado, ya e avanzado un poco en
relación a la metodología a usar, pero sigo con la siguiente duda:
Siguiendo un poco el ejemplo que propongo entonces me quedaría, en
cuanto a código, algo así:

DrvMgr dm = new DrvMgr();
for (int i = 0; i < 300; i += 1)
{
string comando=dm.CodificaComando(i);
dm.MeterEnCola(Comando);
}

Pero por otro lado supongo que deberia tener algún proceso que los
vaya sacando conforme se reciban respuestas desde el puerto serie, es
decir, supongo que debería tener un segundo proceso corriendo en
segundo plano encargado de esto. Creo que esto se llama algo así como
multi thread?
Podrian orientarme un poco en el uso de esto ultimo? y la fusin
complementaria con la inclusion y exclusion de los elementos de la
cola

Gracias de antemano
Respuesta Responder a este mensaje
#3 Item
26/09/2008 - 14:17 | Informe spam
Es lo que más sentido tiene ya que alguien (el segundo proceso) debe
encargarse informar cuando debe desencolarse un mensaje de la cola y por lo
que puedo imaginar así debería ser tal y como lo has espuesto.

Programas en NET, no has dicho si en VB o C#.

Hay, por si no tienes experiencia ejemplos a porrillo para hacer distintos
hilos y los coordines (el famoso problema de los filósofos en sistemas
operativos).

Busca los 101 C# o 101 VB en emule o Google.

Yo veo que vas por buen camino.

Suerte porque trabajo tienes y además delicado.

"jesusR" escribió en el mensaje
news:
On 26 sep, 12:27, "Item" wrote:
TAD: "Cola de Prioridad"

Si lo pones en Google aparecerá el algoritmo. A cada proceso le asignas
una
prioridad y al encolar lo hace ordenando por la prioridad.

Luego desencolas normálmente.

"jesusR" escribió en el
mensajenews:
Hola, les presento la siguiente situación:
Tengo desarrollada una clase (DrvMgr) que se encarga de codificar
cierta información(a traves de un método llamado CodificaComando) y
enviarla a un dispositivo conectado en el puerto serie (a traves de su
método llamado EnviarDato). el dispositivo retorna un comando por el
mismo puerto Serie.

Luego tengo una aplicacion windows que utiliza esta clase para el
envio de estos mensajes.

El problema esta en que requiero hacer una "cola" de mensajes, es
decir, tengo que evitar que sean enviados N mensajes "en el mismo
momento" al dispositivo.
Por ejemplo, la aplicacion de windows realiza lo siguiente:
DrvMgr dm = new DrvMgr();
for (int i = 0; i < 300; i += 1)
{
string comando=dm.CodificaComando(i);
dm.EnviarDato(comando);
System.Threading.Thread.Sleep(2000);
}
en donde dm es la instancia a mi clase que codificará la info y la
envia al puerto COM. BuscaComando codifica y devuelve una cadena de
alrededor de 10 Kb, y por ultimo EnviarDato es el método que enviará
la cadena al dispositivo a través del puerto Serie (COM).

Actualmente incluyo en el código de envío la siguiente instrucción:
System.Threading.Thread.Sleep(2000); esto para evitar que tanto el
puerto del PC como del dispositivo se saturen.

La idea es realmente ir metiendo los mensajes en una cola e irlos
sacando después que el dispositivo emita una respuesta.
Me imagino que sera haciendo algo tipo cola o algo así.

Algún comentario?



Item, gracias por tu pronta respuesta.
Con la información que me has facilitado, ya e avanzado un poco en
relación a la metodología a usar, pero sigo con la siguiente duda:
Siguiendo un poco el ejemplo que propongo entonces me quedaría, en
cuanto a código, algo así:

DrvMgr dm = new DrvMgr();
for (int i = 0; i < 300; i += 1)
{
string comando=dm.CodificaComando(i);
dm.MeterEnCola(Comando);
}

Pero por otro lado supongo que deberia tener algún proceso que los
vaya sacando conforme se reciban respuestas desde el puerto serie, es
decir, supongo que debería tener un segundo proceso corriendo en
segundo plano encargado de esto. Creo que esto se llama algo así como
multi thread?
Podrian orientarme un poco en el uso de esto ultimo? y la fusin
complementaria con la inclusion y exclusion de los elementos de la
cola

Gracias de antemano
Respuesta Responder a este mensaje
#4 mgldelima
26/09/2008 - 14:53 | Informe spam
On 26 sep, 07:07, jesusR wrote:

Algún comentario?



Lo que necesitas es mantener ambos dispositivos sincronizados.
Funcionando a la misma tasa. Una cola no sirve para eso. Su propósito
es evitar la pérdida de data ante un congestionamiento del momento.

Si los dispositivos no están sincronizados, vas a tener una cola
siempre vacía o infinitamente llena. Si tu dispositivo no puede
procesar esa cantidad de data, ninguna cola lo ayudará... me parece.
Respuesta Responder a este mensaje
#5 jesusR
29/09/2008 - 09:24 | Informe spam
On 26 sep, 14:53, wrote:
On 26 sep, 07:07, jesusR wrote:

> Algún comentario?

Lo que necesitas es mantener ambos dispositivos sincronizados.
Funcionando a la misma tasa. Una cola no sirve para eso. Su propósito
es evitar la pérdida de data ante un congestionamiento del momento.

Si los dispositivos no están sincronizados, vas a tener una cola
siempre vacía o infinitamente llena. Si tu dispositivo no puede
procesar esa cantidad de data, ninguna cola lo ayudará... me parece.



Tanto el dispositivo como el el puerto del Pc estan configurados a la
misma velocidad, asi que por ese sentido jamas perdere data. La cola
la creo para enviar mensaje a mensaje. MAs a detalle, los dispositivos
son impresoras termicas, al cual se les envia cadenas codificadas con
lo que se desea imprimir.
cada mensaje es un documento que ha de imprimir. Lo que quiero evitar
con la cola es enviar un lote de documentos y el buffer de recepcion
de la impresora se llegue a saturar, por lo cual meto todos los
mensajes en cola, y a medida que la impresora responde (dando un ok de
impresion) envio un nuevo documento.
Que por que no uso los drivers propios de la impresora y las clases
propias de impresion de .NET? Por requerimientos de desarrollo.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida