pvbrowser manual
Back Content Forward

Función main

La función main es diferente en USE_INETD y en un MULTI_THREADED pvserver. Para elegir deberás poner un #define en tu programa eligiendo cualquiera de los dos. En el caso de USE_INETD mira también el fichero de proyecto, ya que son necesarios más pasos.

En el caso de un servidor MULTI_THREADED, que es el usado por defecto ya que no necesita nada externo, pvserver ejectua un loop esperando a clientes. Cuando un cliente se conecta, se abre un hilo que llamará a pvMain para gestionar la información para el cliente.

En el caso de USE_INETD, el "superserver" (x)inetd llamará a pvserver para cada usuario que se conecte. pvserver usará los stdin y stdout para comunicar con el pvbrowser. En este caso pvserver consiste únicamente de un proceso por cliente, mientras que en el caso de un servidor MULTI_THREADED hay un hilo para cada cliente y un hilo esperando clientes.

En pvMain hay además un loop en el cual todas las máscaras disponibles pueden ser ejecutadas. El valor de retorno de una máscara define que máscara se llamará después.

/***************************************************************************
                          main.cpp  -  description
                             -------------------
    begin                : So Mai 14 10:22:48 2006
    email                : lehrig@t-online.de
 ***************************************************************************/
#include "pvapp.h"
// todo: comment me out. you can insert these objects as extern in your masks.
//rlModbusClient     modbus(modbusdaemon_MAILBOX,modbusdaemon_SHARED_MEMORY,modbusdaemon_SHARED_MEMORY_SIZE);
//rlSiemensTCPClient siemensTCP(siemensdaemon_MAILBOX,siemensdaemon_SHARED_MEMORY,siemensdaemon_SHARED_MEMORY_SIZE);
//rlPPIClient        ppi(ppidaemon_MAILBOX,ppidaemon_SHARED_MEMORY,ppidaemon_SHARED_MEMORY_SIZE);

int pvMain(PARAM *p)
{
int ret;

  pvSetCaption(p,"pvs");
  pvResize(p,0,1280,1024);
  //pvScreenHint(p,1024,768); // this may be used to automatically set the zoomfactor
  ret = 1;
  pvGetInitialMask(p);
  if(strcmp(p->initial_mask,"mask1") == 0) ret = 1;

  while(1)
  {
    switch(ret)
    {
      case 1:
        pvStatusMessage(p,-1,-1,-1,"mask1");
        ret = show_mask1(p);
        break;
      default:
        return 0;
    }
  }
}

#ifdef USE_INETD
int main(int ac, char **av)
{
PARAM p;

  pvInit(ac,av,&p);
  /* here you may interpret ac,av and set p->user to your data */
  pvMain(&p);
  return 0;
}
#else  // multi threaded server
int main(int ac, char **av)
{
PARAM p;
int   s,i;

  pvInit(ac,av,&p);
  /* here you may interpret ac,av and set p->user to your data */
  for(i=1; i<ac; i++)
  {
    if(strcmp(av[i],"-1") == 0)
    {
      s = pvAccept(&p);
      if(s > 0)
      {
        p.s = s;
        p.free = 0;
        pvMain(&p);
      }
      else
      {
        printf("pvAccept error\n");
      }
      return 0;
    }
  }
  while(1)
  {
    s = pvAccept(&p);
    if(s != -1) pvCreateThread(&p,s);
    else        break;
  }
  return 0;
}
#endif

Back Content Forward