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