pvbrowser manual
Back Content Forward

Функция main

Функцията main е различна за USE_INETD и за MULTI_THREADED (многонишков) pvserver. Това се определя от директивата #ifdef. Вижте също проектния файл при използване на USE_INETD.

В случай на MULTI_THREADED сървър, което е по подразбиране, pvserver влиза в цикъл, където чака заявки от клиенти. Отделна нишка се създава, която стартира функцията pvMain, за да обслужи заявката.

В случай на USE_INETD, супердемона (x)inetd, ще стартира pvserver, който ще използва стандартните вход (stdin) и изход (stdout) за комуникация с pvbrowser. В този случай pvserver се състои само от един процес за всеки клиент, докато в многонишковия режим се създава по една нишка на клиент + една нишка за посрещане на клиенти.

В pvMain също има цикъл, който вика всички налични маски. Стойността, връщана от всяка маска определя коя маска да бъде извикана следваща.

/***************************************************************************
                          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