pvbrowser manual
Zurück Inhalt Vor

Main Funktion

Die main Funktion ist unterschiedlich für USE_INETD und MULTI_THREADED pvserver. Dies wird durch eine #ifdef Präprozessordirektive unterschieden. USE_INETD wird in der Projektdatei spezifiziert.

Im Falle eines MULTI_THREADED server, was Standard ist, läuft pvserver in einer Schleife und wartet auf Clienten. Wenn ein Client sich verbindet, wird ein neuer Thread aufgemacht der pvMain aufruft, um den Clienten zu bedienen.

Im Falle von USE_INETD wird der Superserver (x)inetd pvserver aufrufen. pvserver benutzt dann stdin und stdout zur Kommunikation mit pvbrowser. In diesem Falle besteht pvserver nur aus einem einzigen Thread, wohingegen bei einem MULTI_THREADED pvserver 1 Thread pro Client + 1 Thread zum akzeptieren eines Clienten benötigt wird.

In pvMain gibt es ebenfalls eine Schleife in der alle verfügbaren Masken aufgerufen werden. Der Rückgabewert einer Maske bestimmt, welche Maske als nächste aufgerufen wird.

//***************************************************************************
//                          main.cpp  -  description
//                             -------------------
//  begin            : Di Okt 6 11:25:46 2009
//  generated by     : pvdevelop (C) Lehrig Software Engineering
//  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)
  {
    if(trace) printf("show_mask%d\n", ret);
    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;

  pvInit(ac,av,&p);
  /* here you may interpret ac,av and set p->user to your data */
  while(1)
  {
    s = pvAccept(&p);
    if(s != -1) pvCreateThread(&p,s);
    else        break;
  }
  return 0;
}
#endif

Zurück Inhalt Vor