Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Alternativa a ProcessMessages (https://www.clubdelphi.com/foros/showthread.php?t=82067)

Novatin 23-01-2013 03:34:26

Alternativa a ProcessMessages
 
Hola Amigos,

Acá voy luchando con un nuevo problema...

Tengo el siguiente código en un click text button:

Código:

int j;
for (int i=1;i<=27000;i++)
{
    j = CaptaSeñal();
    Edit1->Text= i;
}

Les explico: sucede que estoy tratando de contar las revoluciones por minuto de un Motor, para ello tengo la funcion CaptaSeñal me captura un ciclo del motor por puerto paralelo, y la idea es que por cada ciclo captado en un Edit1 quiero ir contando y mostranto las veces que se capta la señal, sin embargo acá tengo un pequeño gran inconveniente... al llegar a este bloque For se me congela el programa sin mostrar nada en el Edit1 hasta que termina de captar las 27000 veces... y al incluirle la instrucción Application->ProcessMessages() luego de Edit1->Text ya no me hace un conteo correcto... supongo que sucede por que voy haciendo otras cosas en la misma pc(como abrir un documento, cargar otro programa,etc) pero lo que busco es justamente eso: dejar al algoritmo contando entretanto yo voy haciendo otras cosas en la misma pc...

¿Es posible hacer esto? Es por ello que recurro a Uds, si pudieran darme algun consejo al respecto del uso de Application->ProcessMessages, o talves otra opción que uds conozcan...

De antemano muchas gracias.

Un Saludo.

mamcx 23-01-2013 04:01:38

Mientras desconozco sobre C++ y librerias en esa plataforma, existen 2 soluciones universales para operar en estos casos.

Aunque existan "trucos" para hacer parecer que la app funciona bien, siempre terminas encontrando un cuello de botella (excepto en los casos triviales) ya que la mayoria del codigo es sincronico y "bloquea" por defecto por cada llamada.

La primera, es usar un hilo "de fondo" que va enviando los resultados a la GUI. Hay muchos ejemplos de uso de hilos, y para casos simples es una opcion viable. PERO, si requieres un manejo ligeramente complicado puede resultar dificil (y el problema de los hilos es que no es obvio ni predecible que muro te encontraras).

La segunda, es operar de forma asincronica.

Junto a una cola (http://es.wikipedia.org/wiki/Cola_(inform%C3%A1tica)) con un procesador de colas.

Una liberia con la que experimente alguna vez y permite operar un procesador de colas embeido es http://www.zeromq.org/intro:read-the-manual.

Lo elegante de esta via, es que un procesador de colas es una pieza de software muy eficiente en manejar cantidades grandes de mensajes, operar en ellos y de una forma mas intuitiva que el manejo de hilos (los procesadores de colas pueden o no manejar internamente esos hilos).

Mira la guia de 0mq, en especial el metodo de PUB-SUB (Publica-Suscribe)


http://zguide.zeromq.org/cpp:wuclient

P.D: Windows tiene un sistema masomenos parecido usando "windows messages" http://www.delphitricks.com/source-c...ndmessage.html, que puede resulte aun mas facil que hilos. Pero si piensas manejar mucho este caso de uso y realmente necesitas poder aguantar cuanta cantidad de datos te puedas imaginar, 0mq es una mucho mejor opcion (los mensajes de windows estan hechos para comunicar eventos en la GUI, ppalmente).

Novatin 25-01-2013 17:26:06

Gracias por la respuesta...

Sabia que tarde o temprano tendría que entrarle a los hilos... pero no tan temprano... :rolleyes: (voy por mi segundo proyecto relativamente grande en builder)

Y ahora que lo veo "0mq" -vaya nombrecito, por poco y pense que era un "error de dedo" :D - tambien me parece buena opción, antes de los temibles "hilos"... lo probare y les cuento como me fue. De todos modos si hubiera otra opción acá soy todo ojitos (pa leerlos)..


un saludo.


La franja horaria es GMT +2. Ahora son las 09:36:02.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi