Index: /trunk/SophyaPI/PIext/nobjmgr.cc
===================================================================
--- /trunk/SophyaPI/PIext/nobjmgr.cc	(revision 2490)
+++ /trunk/SophyaPI/PIext/nobjmgr.cc	(revision 2491)
@@ -36,4 +36,6 @@
 #include "pigfd1.h"
 #include "pigfd2.h"
+
+#include "zthread.h"
 
 
@@ -94,4 +96,6 @@
 static string* TmpDir;  // Repertoire pour les compilations / link dynamique
 
+// Pour gestion multithread 
+static ZMutex* myMutex;
 // ..................................................................
 
@@ -119,14 +123,14 @@
   currDir = new string("home");
   string dirn = "home";
-  CreateDir(dirn);
+  CreateDir_P(dirn);
   SetKeepOldDirAtt(dirn, false);
   dirn = "tmp";
-  CreateDir(dirn);
+  CreateDir_P(dirn);
   SetKeepOldDirAtt(dirn, false);
   dirn = "autoc";
-  CreateDir(dirn);
+  CreateDir_P(dirn);
   SetKeepOldDirAtt(dirn, false);
   dirn = "old";
-  CreateDir(dirn);
+  CreateDir_P(dirn);
   SetKeepOldDirAtt(dirn, false);
   dirn = "home";
@@ -138,5 +142,6 @@
   int l = (*TmpDir).length();
   if ( (l>0) && ((*TmpDir)[l-1] != '/') )  (*TmpDir) += '/';
-  servnobjm = new Services2NObjMgr(this, (*TmpDir));
+  servnobjm = new Services2NObjMgr(*TmpDir);
+  myMutex = new ZMutex;
   }
 fgOInit++;
@@ -154,4 +159,5 @@
   delete myDirs;
   delete myVars;
+  delete myMutex;
 }
 }
@@ -223,4 +229,5 @@
     return(false);
   }
+  ZSync(*myMutex);
 #ifdef SANS_EVOLPLANCK
   bool fg = true;
@@ -240,4 +247,5 @@
     return(false);
   }
+  ZSync(*myMutex);
 #ifdef SANS_EVOLPLANCK
   DVList::ValList::const_iterator it;
@@ -257,4 +265,5 @@
     return(false);
   }
+  ZSync(*myMutex);
 #ifdef SANS_EVOLPLANCK
   return(false);
@@ -271,4 +280,5 @@
     return("");
   }
+  ZSync(*myMutex);
   //  cout << " DEBUG::GetVar " << *myVars << endl;
   return(myVars->GetS(key));
@@ -279,4 +289,5 @@
 {
   //  cout << " DEBUG::GetVarList " << *myVars << endl;
+  ZSync(*myMutex);
   return(*myVars);
 }
@@ -284,4 +295,11 @@
 /* --Methode-- */
 bool NamedObjMgr::CreateDir(string & dirname)
+{
+  ZSync(*myMutex);
+  return CreateDir_P(dirname);
+}
+
+/* --Methode-- */
+bool NamedObjMgr::CreateDir_P(string & dirname)
 {
 if ( !CheckDirName(dirname) ) {
@@ -317,4 +335,5 @@
   return(false); 
   }
+ZSync(*myMutex);
 NObjDirList::iterator it = myDirs->find(dirname);
 if (it == myDirs->end()) {
@@ -347,4 +366,5 @@
 void NamedObjMgr::LockDir(string & dirname)
 {
+ZSync(*myMutex);
 if ( !CheckDirName(dirname) ) return;
 NObjDirList::iterator it = myDirs->find(dirname);
@@ -358,4 +378,5 @@
 void NamedObjMgr::UnlockDir(string & dirname)
 {
+ZSync(*myMutex);
 if ( !CheckDirName(dirname) ) return;
 NObjDirList::iterator it = myDirs->find(dirname);
@@ -369,4 +390,5 @@
 void NamedObjMgr::SetKeepOldDirAtt(string & dirname, bool keepold)
 {
+ZSync(*myMutex);
 if ( !CheckDirName(dirname) ) return;
 NObjDirList::iterator it = myDirs->find(dirname);
@@ -384,4 +406,5 @@
 bool NamedObjMgr::SetCurrentDir(string & dirname)
 {
+ZSync(*myMutex);
 if ( !CheckDirName(dirname) ) {
   cout << "NamedObjMgr::SetCurrentDir( " << dirname << ") Error - Invalid name !" << endl;
@@ -401,4 +424,5 @@
 void NamedObjMgr::GetCurrentDir(string & dirname)
 {
+ZSync(*myMutex);
 dirname = *currDir;
 }
@@ -407,4 +431,5 @@
 void NamedObjMgr::ListDirs(string & patt)
 {
+ZSync(*myMutex);
 NObjDirList::iterator it;
 string cn;
@@ -426,4 +451,5 @@
 void NamedObjMgr::GetDirList(string & patt, vector<string>& lstd)
 {
+ZSync(*myMutex);
 NObjDirList::iterator it;
 string cn;
@@ -437,4 +463,11 @@
 /* --Methode-- */
 void NamedObjMgr::CleanDir(string & dirname)
+{
+ZSync(*myMutex);
+CleanDir_P(dirname);
+}
+
+/* --Methode-- */
+void NamedObjMgr::CleanDir_P(string & dirname)
 {
 if ( !CheckDirName(dirname) ) {
@@ -493,7 +526,13 @@
 //--
 
-
 /* --Methode-- */
 bool NamedObjMgr::AddObj(AnyDataObj* obj, string & nom, bool crd)
+{
+  ZSync(*myMutex);
+  return AddObj_P(obj, nom, crd);
+}
+
+/* --Methode-- */
+bool NamedObjMgr::AddObj_P(AnyDataObj* obj, string & nom, bool crd)
 {
 
@@ -516,10 +555,10 @@
     return(false);
     }
-  else { CreateDir(nrep);  did =  myDirId; }
+  else { CreateDir_P(nrep);  did =  myDirId; }
   }
 
 // Si c'est le repertoire /autoc, on nettoie
 if (nrep == "autoc")  {
-  CleanDir(nrep);
+  CleanDir_P(nrep);
   }
 
@@ -543,5 +582,5 @@
     sprintf(buff, "%d", (*it).second.oid); 
     string nomnew = "/autoc/" + nobj + buff;
-    RenameObj(nom, nomnew);
+    RenameObj_P(nom, nomnew);
     }                              
   else if ( (*itr).second.keepold ) { // On met l'ancien objet dans /old
@@ -550,9 +589,9 @@
     sprintf(buff, "%d", (*it).second.oid);
     string nomnew = "/old/" + nobj + buff;
-    RenameObj(nom, nomnew);
+    RenameObj_P(nom, nomnew);
     }
   else {  // Sinon, on remplace l'objet
     cout << "NamedObjMgr::AddObj() - Replacing " << nom << endl;
-    DelObj(nom);
+    DelObj_P(nom);
     }
   }
@@ -581,4 +620,5 @@
 bool NamedObjMgr::AddObj(AnyDataObj& obj, string & nom, bool crd)
 {
+ZSync(*myMutex);
 NObjMgrAdapter* adap = GetServiceObj()->GetAdapter(&obj);
 if (adap == NULL) {
@@ -592,9 +632,16 @@
   return(false);
 }
-return ( AddObj(cloneobj , nom, crd) );
+return ( AddObj_P(cloneobj , nom, crd) );
 }
 
 /* --Methode-- */
 bool NamedObjMgr::RenameObj(string & nom, string& nomnew)
+{
+  ZSync(*myMutex);
+  return RenameObj_P(nom, nomnew);
+}
+
+/* --Methode-- */
+bool NamedObjMgr::RenameObj_P(string & nom, string& nomnew)
 {
 string n1,r1,n2,r2;
@@ -657,4 +704,5 @@
 bool NamedObjMgr::CopyObj(string & nom, string& nomcp)
 {
+ZSync(*myMutex);
 if(nomcp.length()<=0)
   {cout<<"NamedObjMgr::CopyObj() Error, copied obj name "<<nomcp<<" not valid"<<endl;
@@ -666,11 +714,17 @@
 AnyDataObj* obnomcp = obnom->CloneDataObj();
 if(obnomcp==NULL) return(false);
-if(! AddObj(obnomcp,nomcp) ) {delete obnomcp; return(false);}
+if(! AddObj_P(obnomcp,nomcp,false) ) {delete obnomcp; return(false);}
 return true;
 }
 
-
 /* --Methode-- */
 bool NamedObjMgr::DelObj(string & nom, bool fgd)
+{
+  ZSync(*myMutex);
+  return DelObj_P(nom, fgd);
+}
+
+/* --Methode-- */
+bool NamedObjMgr::DelObj_P(string & nom, bool fgd)
 {
 string n1,r1;
@@ -713,4 +767,5 @@
 bool NamedObjMgr::DelObj_Id(int oid)
 {
+ZSync(*myMutex);
 NObjList::iterator it;
 string nom;
@@ -728,4 +783,5 @@
 void NamedObjMgr::DelObjects(string & patt, bool fgd)
 {
+ZSync(*myMutex);
 string n1,r1;
 ParseObjectName(patt, r1, n1);
@@ -739,5 +795,5 @@
   }
 list<string>::iterator ii;
-for(ii=odel.begin(); ii != odel.end(); ii++)  DelObj(*ii, fgd);
+for(ii=odel.begin(); ii != odel.end(); ii++)  DelObj_P(*ii, fgd);
 }
 
@@ -745,4 +801,5 @@
 AnyDataObj* NamedObjMgr::GetObj(string & nom)
 {
+ZSync(*myMutex);
 string n1,r1;
 ParseObjectName(nom, r1, n1);
@@ -756,4 +813,5 @@
 NObjMgrAdapter* NamedObjMgr::GetObjAdapter(string & nom)
 {
+ZSync(*myMutex);
 string n1,r1;
 ParseObjectName(nom, r1, n1);
@@ -767,4 +825,5 @@
 void NamedObjMgr::ListObjs(string & patt)
 {
+ZSync(*myMutex);
 int k;
 AnyDataObj* obj=NULL;
@@ -795,4 +854,5 @@
 void NamedObjMgr::GetObjList(string & patt, vector<string> &lst)
 {
+ZSync(*myMutex);
 string n1,r1;
 if (patt.length() < 1)  return;
@@ -830,4 +890,5 @@
 void NamedObjMgr::ReadObj(string const & flnm, string & nobj)
 {
+ZSync(*myMutex);
 PPersist* ppobj=NULL;
 bool ok = true;
@@ -852,5 +913,5 @@
 if (!ok)  return;
 if (nobj.length()<1)  nobj = servnobjm->FileName2Name(flnm);
-AddObj(ppobj->DataObj(), nobj, true);
+AddObj_P(ppobj->DataObj(), nobj, true);
 cout << "NamedObjMgr::ReadObj(...) object " << nobj << " read from file " << endl;
 return;
@@ -860,4 +921,5 @@
 void NamedObjMgr::ReadObj(PInPersist& s, int num)
 {
+ZSync(*myMutex);
 int_4 i; // $CHECK$ int -> int_4 a cause de TagKey
 #ifdef SANS_EVOLPLANCK
@@ -903,5 +965,5 @@
   if (!ok)  return;
   nom = "";
-  AddObj(obj->DataObj(), nom);
+  AddObj_P(obj->DataObj(), nom, false);
   nread++;
 }
@@ -933,5 +995,5 @@
     }
 #endif
-  if (ok)  { AddObj(obj->DataObj(), nom, true);  nread++; }
+  if (ok)  { AddObj_P(obj->DataObj(), nom, true);  nread++; }
 }
 
@@ -942,4 +1004,5 @@
 void NamedObjMgr::ReadAll(string const & flnm)
 {
+ZSync(*myMutex);
 bool ok = true;
 PPersist* obj=NULL;
@@ -968,5 +1031,5 @@
 if (obj) {
   string nom = servnobjm->FileName2Name(flnm);
-  AddObj(obj->DataObj(), nom);
+  AddObj_P(obj->DataObj(), nom, false);
   }
 else ReadObj((*ppin), -1);
@@ -978,5 +1041,5 @@
 void NamedObjMgr::ReadFits(string const & flnm, string & nobj)
 {
-
+ZSync(*myMutex);
 #ifdef SANS_EVOLPLANCK 
 bool ok = false;
@@ -993,5 +1056,5 @@
 if (ok && (obj != NULL)) { 
   if (nobj.length()<1)  nobj = servnobjm->FileName2Name(flnm);
-  AddObj((AnyDataObj*)obj, nobj);
+  AddObj_P((AnyDataObj*)obj, nobj);
 }
 #else
@@ -1018,5 +1081,5 @@
        }
        else name = nobj;
-       AddObj(obj, name);
+       AddObj_P(obj, name, false);
        kon++;
      }
@@ -1035,8 +1098,14 @@
 }
 
+/* --Methode-- */
+void NamedObjMgr::SaveObj(string & nom, POutPersist& s, bool keeppath)
+{
+  ZSync(*myMutex);
+  SaveObj_P(nom, s, keeppath);
+}
 
 static int key_for_write = 5000;
 /* --Methode-- */
-void NamedObjMgr::SaveObj(string & nom, POutPersist& s, bool keeppath)
+void NamedObjMgr::SaveObj_P(string & nom, POutPersist& s, bool keeppath)
 {
 if (nom.length() < 1) return;
@@ -1057,4 +1126,5 @@
 void NamedObjMgr::SaveObjects(string & patt, string const& flnm)
 {
+ZSync(*myMutex);
 string n1,r1;
 if (patt.length() < 1)  return;
@@ -1086,5 +1156,5 @@
   cn = (*it).first;
   if (csh_parse(cn.c_str(), patt.c_str()) == 0)  continue;
-  SaveObj(cn, (*pout), keeppath);
+  SaveObj_P(cn, (*pout), keeppath);
   }
 delete pout;
@@ -1095,4 +1165,5 @@
 void NamedObjMgr::SaveAll(string const& flnm)
 {
+ZSync(*myMutex);
 bool ok = true;
 
@@ -1118,5 +1189,5 @@
 for(it = myObjs->begin(); it != myObjs->end(); it++) {
   no = (*it).first;
-  SaveObj(no, (*pout), true);
+  SaveObj_P(no, (*pout), true);
   }
 delete pout;
@@ -1127,4 +1198,6 @@
 void NamedObjMgr::SaveFits(string& nom, string const & flnm)
 {
+ZSync(*myMutex);
+
 NObjMgrAdapter* obja=NULL;
 obja = GetObjAdapter(nom);
@@ -1139,4 +1212,5 @@
 void NamedObjMgr::PrintObj(string& nom)
 {
+ZSync(*myMutex);
 NObjMgrAdapter* obja=NULL;
 obja = GetObjAdapter(nom);
@@ -1157,4 +1231,6 @@
 void NamedObjMgr::DisplayObj(string& nom, string dopt) 
 {
+ZSync(*myMutex);
+
 NObjMgrAdapter* obja=NULL;
 obja = GetObjAdapter(nom);
@@ -1185,10 +1261,13 @@
 ParseObjectName(nom, r1, n1);
 
+// Si appel venant de PIStdImgApp, il ne faut pas locker le Mutex global de la boucle d'evts
+bool fglock = (_fgimgapp) ? false : true;
+
 if (dr) { 
   PIDrawer3D * dr3 = dynamic_cast<PIDrawer3D *>(dr);
-  if(dr3)  wrsid = myImgApp->Disp3DDrawer(dr3, n1, dopt);
-  else wrsid = myImgApp->DispScDrawer( dr, n1, dopt); 
-  }
-else if (arr) wrsid = myImgApp->DispImage(arr, n1, dopt);
+  if(dr3)  wrsid = myImgApp->Disp3DDrawer(dr3, n1, dopt, "", 0, fglock);
+  else wrsid = myImgApp->DispScDrawer( dr, n1, dopt, "", 0, fglock); 
+  }
+else if (arr) wrsid = myImgApp->DispImage(arr, n1, dopt, 0, fglock);
 
 AddWRsId(nom, wrsid);
@@ -1199,4 +1278,6 @@
 void NamedObjMgr::DisplayImage(string& nom, string dopt)
 {
+ZSync(*myMutex);
+
 NObjMgrAdapter* obja=NULL;
 obja = GetObjAdapter(nom);
@@ -1222,6 +1303,9 @@
 ParseObjectName(nom, r1, n1);
 
+// Si appel venant de PIStdImgApp, il ne faut pas locker le Mutex global de la boucle d'evts
+bool fglock = (_fgimgapp) ? false : true;
+
 int wrsid = 0;
-wrsid = myImgApp->DispImage(arr, n1, dopt);
+wrsid = myImgApp->DispImage(arr, n1, dopt, 0, fglock);
 
 AddWRsId(nom, wrsid);
@@ -1231,4 +1315,6 @@
 void NamedObjMgr::DisplaySurf3D(string& nom, string dopt)
 {
+ZSync(*myMutex);
+
 NObjMgrAdapter* obja=NULL;
 obja = GetObjAdapter(nom);
@@ -1261,7 +1347,10 @@
 ParseObjectName(nom, r1, n1);
 
+// Si appel venant de PIStdImgApp, il ne faut pas locker le Mutex global de la boucle d'evts
+bool fglock = (_fgimgapp) ? false : true;
+
 int wrsid = 0;
 PISurfaceDrawer* sdr = new PISurfaceDrawer(arr, true, true, true);
-wrsid = myImgApp->Disp3DDrawer(sdr, n1, dopt);
+wrsid = myImgApp->Disp3DDrawer(sdr, n1, dopt, "", 0, fglock);
 AddWRsId(nom, wrsid);
 return; 
@@ -1273,4 +1362,6 @@
                             string& label, string dopt, bool fg3d)
 {
+ZSync(*myMutex);
+
 AnyDataObj* obj=GetObj(nom);
 if (obj == NULL) {
@@ -1293,4 +1384,7 @@
 string n1,r1;
 ParseObjectName(nom, r1, n1);
+
+// Si appel venant de PIStdImgApp, il ne faut pas locker le Mutex global de la boucle d'evts
+bool fglock = (_fgimgapp) ? false : true;
 
 if ( fg3d && (nmz.length()>0) )  { // Display 3D
@@ -1301,5 +1395,5 @@
   pin->SelectErrBar(erx.c_str(), ery.c_str(), erz.c_str());
   string titre = nmz + "%" + nmy + "%" + nmz;
-  wrsid = myImgApp->Disp3DDrawer(pin, n1, dopt, titre);  
+  wrsid = myImgApp->Disp3DDrawer(pin, n1, dopt, titre, 0, fglock);  
 }
 else {
@@ -1310,5 +1404,5 @@
   pin->SelectErrBar(erx.c_str(), ery.c_str());
   string titre = nmy + "%" + nmx;
-  wrsid = myImgApp->DispScDrawer( (PIDrawer*)pin, n1, dopt, titre);
+  wrsid = myImgApp->DispScDrawer( (PIDrawer*)pin, n1, dopt, titre, 0, fglock);
   }
 
@@ -1331,4 +1425,6 @@
 //|  opt = options generales pour le display.
 {
+ZSync(*myMutex);
+
 AnyDataObj* obj=GetObj(nom);
 if(obj == NULL)
@@ -1356,4 +1452,6 @@
  string n1,r1;
  ParseObjectName(nom, r1, n1);
+ // Si appel venant de PIStdImgApp, il ne faut pas locker le Mutex global de la boucle d'evts
+ bool fglock = (_fgimgapp) ? false : true;
 
  int wrsid = 0;
@@ -1362,10 +1460,10 @@
   pigfd->SelectXY(numvx,numvy);
   pigfd->SelectErrBar(errx,erry,errz);
-  wrsid = myImgApp->Disp3DDrawer(pigfd,n1,dopt);  
+  wrsid = myImgApp->Disp3DDrawer(pigfd,n1,dopt,"",0,fglock);  
 } else {                   // display 2D
   PIGenFitDat* pigfd = new PIGenFitDat(((GeneralFitData*)obj),false);
   pigfd->SelectX(numvx);
   pigfd->SelectErrBar(errx,erry);
-  wrsid = myImgApp->DispScDrawer((PIDrawer*)pigfd,n1,dopt);
+  wrsid = myImgApp->DispScDrawer((PIDrawer*)pigfd,n1,dopt,"",0,fglock);
 }
 
@@ -1380,4 +1478,6 @@
 //   nomvx et nomvy
 {
+ZSync(*myMutex);
+
 #ifdef SANS_EVOLPLANCK
   cerr << " NamedObjMgr::DisplayVector() Error: Not implemented with PEIDA " << endl;
@@ -1439,7 +1539,10 @@
 ParseObjectName(nomvy, ry, ny);
 
+// Si appel venant de PIStdImgApp, il ne faut pas locker le Mutex global de la boucle d'evts
+bool fglock = (_fgimgapp) ? false : true;
+
 string title = ny + " (Y) vs. " + nx + " (X)";
 // display 2D
-myImgApp->DispScDrawer(vxydrw, title, dopt);
+myImgApp->DispScDrawer(vxydrw, title, dopt, "", 0, fglock);
 
 return;
@@ -1489,4 +1592,5 @@
 {
 if (!myImgApp)  return;
+ZSync(*myMutex);
 if ( !_fgimgapp )  ZSync(myImgApp->getMutex(),2);
 
Index: /trunk/SophyaPI/PIext/nobjmgr.h
===================================================================
--- /trunk/SophyaPI/PIext/nobjmgr.h	(revision 2490)
+++ /trunk/SophyaPI/PIext/nobjmgr.h	(revision 2491)
@@ -109,4 +109,11 @@
 
 protected:
+  virtual bool		CreateDir_P(string & dirname);
+  virtual void		CleanDir_P(string & dirname);
+  virtual bool		AddObj_P(AnyDataObj* obj, string & nom, bool crd);
+  virtual bool		RenameObj_P(string & nom, string& nomnew);
+  virtual bool          DelObj_P(string & nom, bool fgd=true);
+  virtual void          SaveObj_P(string & nom, POutPersist& s, bool keeppath=false);
+
   bool _fgimgapp;  // true -> cree par PIStdImgApp / pour gestion de thread
 };
Index: /trunk/SophyaPI/PIext/pistdimgapp.cc
===================================================================
--- /trunk/SophyaPI/PIext/pistdimgapp.cc	(revision 2490)
+++ /trunk/SophyaPI/PIext/pistdimgapp.cc	(revision 2491)
@@ -383,4 +383,5 @@
 }  
 
+/*
 class RunAlarm : public Periodic {
 public:
@@ -393,5 +394,24 @@
   PIStdImgApp* _app;
 };
-
+*/
+
+class Reveil : public ZThread {
+public:
+  Reveil(PIStdImgApp* app) :
+    ZThread() 
+  { _app = app; _fgstop = false; }
+  virtual ~Reveil() { }
+  inline void Stop() { _fgstop = true; }
+  virtual void run() 
+  {
+    while (!_fgstop) {
+      usleep(1000);
+      _app->getMutex().broadcast();
+    }
+  }
+
+  PIStdImgApp* _app;
+  bool _fgstop;
+};
 /* --Methode-- */
 void PIStdImgApp::Run()
@@ -409,6 +429,8 @@
 // Creation et demarrage de l'objet de reveil periodique
 // de la boucle d'evts 
-RunAlarm * mru = new RunAlarm(this);
-//mru->Start();
+/* RunAlarm * mru = new RunAlarm(this);
+   mru->Start(); */
+Reveil* mrv = new Reveil(this);
+mrv->start(); 
 // Demarrage du thread de l'interpreteur
 CmdInterpreter()->start();
@@ -420,18 +442,25 @@
 
 
+thr_glsyn.lock(); //  <ZThread> 
+//DBG int klp = 0;
 while (mStop) {
-  thr_glsyn.lock(); //  <ZThread> 
   fg_glsynlock = true;
+  int nevtproc = 0;
   while (XtAppPending(*appctx) != 0) {
     XtAppNextEvent(*appctx, &evt);
     XtDispatchEvent(&evt);
+    nevtproc++;
+    if (nevtproc >= 50)  break;
   }
   fg_glsynlock = false;
-  thr_glsyn.unlock(); //  <ZThread> 
-  //  thr_glsyn.wait();
-  usleep(1000);
-}
-
-delete mru;
+  thr_glsyn.wait();  //  <ZThread> 
+  //  cout << "DBG-Run:: Out of wait " << ++klp << endl;  
+    //  usleep(1000);
+}
+
+thr_glsyn.unlock();  //  <ZThread> 
+mrv->Stop();
+delete mrv;
+// delete mru;
 return;
 }
@@ -599,5 +628,6 @@
 
 /* --Methode-- */
-int PIStdImgApp::DispImage(P2DArrayAdapter* nouv, string const & name, string const& sop, int oid)
+int PIStdImgApp::DispImage(P2DArrayAdapter* nouv, string const & name, string const& sop, 
+			   int oid, bool fglock)
 {
 PIImage* pii;
@@ -626,5 +656,5 @@
 
 // <ZThread> global PIApplication event loop synchronisation
-ZSync zs(thr_glsyn, 2);  
+if (fglock) ZSync zs(thr_glsyn, 2);  
 
 // Choix de la taille de fenetre
@@ -682,5 +712,5 @@
 /* --Methode-- */
 int PIStdImgApp::DispScDrawer(PIDrawer* scd, string const & name, string const& sop, 
-			      string title, int oid)
+			      string title, int oid, bool fglock)
 {
 if (scd == NULL)
@@ -696,5 +726,5 @@
 
 // <ZThread> global PIApplication event loop synchronisation
-ZSync zs(thr_glsyn, 2);  
+if (fglock) ZSync zs(thr_glsyn, 2);  
 
 // Trace en superpoistion
@@ -785,5 +815,5 @@
 /* --Methode-- */
 int PIStdImgApp::Disp3DDrawer(PIDrawer3D* dr3, string const & name, string const& sop, 
-			      string title, int oid)
+			      string title, int oid, bool fglock)
 {
 if (dr3 == NULL)
@@ -800,5 +830,5 @@
 
 // <ZThread> global PIApplication event loop synchronisation
-ZSync zs(thr_glsyn, 2);  
+if (fglock) ZSync zs(thr_glsyn, 2);  
 
 // Trace en superpoistion
Index: /trunk/SophyaPI/PIext/pistdimgapp.h
===================================================================
--- /trunk/SophyaPI/PIext/pistdimgapp.h	(revision 2490)
+++ /trunk/SophyaPI/PIext/pistdimgapp.h	(revision 2491)
@@ -61,9 +61,10 @@
 
   // Methodes d'Affichage generique
-     int  DispImage(P2DArrayAdapter* nouv, string const & name, string const & opt, int oid=0);
+     int  DispImage(P2DArrayAdapter* nouv, string const & name, string const & opt, 
+		    int oid=0, bool fglock=true);
      int  DispScDrawer(PIDrawer* scd, string const & name, string const & opt, 
-		       string title="", int oid=0);
+		       string title="", int oid=0, bool fglock=true);
      int  Disp3DDrawer(PIDrawer3D* scd, string const & name, string const & opt, 
-		       string title="", int oid=0);
+		       string title="", int oid=0, bool fglock=true);
 
   //  Specification (de l'exterieur) de commande a executer 
Index: /trunk/SophyaPI/PIext/servnobjm.cc
===================================================================
--- /trunk/SophyaPI/PIext/servnobjm.cc	(revision 2490)
+++ /trunk/SophyaPI/PIext/servnobjm.cc	(revision 2491)
@@ -47,9 +47,9 @@
 
 /* --Methode-- */
-Services2NObjMgr::Services2NObjMgr(NamedObjMgr* omg, string& tmpdir)
+Services2NObjMgr::Services2NObjMgr(string& tmpdir)
 {
 SetTmpDir(tmpdir);
 mImgapp = NULL;
-mOmg = omg;
+mOmg = NULL;
 dynlink = NULL;
 }
@@ -59,4 +59,5 @@
 {
 CloseDLL();
+if (mOmg) delete mOmg;
 }
 
@@ -237,6 +238,6 @@
   int rsid = mImgapp->DispScDrawer(dr, titre, dopt);
   if (nom.length() > 0) { 
-    mOmg->AddObj(vpy, nom);
-    mOmg->AddWRsId(nom, rsid);
+    MyObjMgr()->AddObj(vpy, nom);
+    MyObjMgr()->AddWRsId(nom, rsid);
     }
   }
@@ -304,6 +305,6 @@
   int rsid = mImgapp->Disp3DDrawer(sdr, titre, dopt);
   if (nom.length() > 0)  { 
-    mOmg->AddObj(mtx, nom);
-    mOmg->AddWRsId(nom, rsid);
+    MyObjMgr()->AddObj(mtx, nom);
+    MyObjMgr()->AddWRsId(nom, rsid);
     }
   }
@@ -327,5 +328,5 @@
  fprintf(fip,"double %s(double ___dummy_variable___) \n{\n",func.c_str());
  // Add all variables already declared
- DVList& varlist = mOmg->GetVarList();
+ DVList& varlist = MyObjMgr()->GetVarList();
  DVList::ValList::const_iterator it;
  for(it = varlist.Begin(); it != varlist.End(); it++) {
@@ -363,5 +364,5 @@
  // Eventually store the result into variable or just print it
  if(resultvarname.size()>0) {
-   if(mOmg->HasVar(resultvarname)) mOmg->DeleteVar(resultvarname);
+   if(MyObjMgr()->HasVar(resultvarname)) MyObjMgr()->DeleteVar(resultvarname);
    char str[512];
    if(result==0.) sprintf(str,"%f",result);
@@ -371,5 +372,5 @@
      else                   sprintf(str,"%.17e",result);
    }
-   mOmg->SetVar(resultvarname,(string)str);
+   MyObjMgr()->SetVar(resultvarname,(string)str);
  } else cout<<result<<" = "<<expval<<endl;
 
@@ -382,5 +383,5 @@
 {
 NObjMgrAdapter* obja=NULL;
-obja = mOmg->GetObjAdapter(nom);
+obja = MyObjMgr()->GetObjAdapter(nom);
 if (obja == NULL) {
   cout << "Services2NObjMgr::DisplayPoints2D() Error , No such object " << nom << endl; 
@@ -422,5 +423,5 @@
 {
 NObjMgrAdapter* obja=NULL;
-obja = mOmg->GetObjAdapter(nom);
+obja = MyObjMgr()->GetObjAdapter(nom);
 if (obja == NULL) {
   cout << "Services2NObjMgr::DisplayPoints3D() Error , No such object " << nom << endl; 
@@ -461,5 +462,5 @@
 {
 NObjMgrAdapter* obja=NULL;
-obja = mOmg->GetObjAdapter(nom);
+obja = MyObjMgr()->GetObjAdapter(nom);
 if (obja == NULL) {
   cout << "Services2NObjMgr::DisplayPoints2DW() Error , No such object " << nom << endl; 
@@ -494,5 +495,5 @@
 {
 NObjMgrAdapter* obja=NULL;
-obja = mOmg->GetObjAdapter(nom);
+obja = MyObjMgr()->GetObjAdapter(nom);
 if (obja == NULL) {
   cout << "Services2NObjMgr::ProjectH1() Error , No such object " << nom << endl; 
@@ -504,5 +505,5 @@
 NTuple* nt = NULL;
 AnyDataObj* oh = NULL; 
-if (nomh1.length() > 0) oh=mOmg->GetObj(nomh1);
+if (nomh1.length() > 0) oh=MyObjMgr()->GetObj(nomh1);
 else nomh1 = "/tmp/projh1d";
 if ( (oh != NULL) && (typeid(*oh) == typeid(Histo)) )  h1 = (Histo*)oh;  // Pas de remise a zero ! h1->Zero();
@@ -531,8 +532,8 @@
     }
   delete nt;
-  mOmg->AddObj(h1, nomh1);
-  }
-
-mOmg->DisplayObj(nomh1, dopt);
+  MyObjMgr()->AddObj(h1, nomh1);
+  }
+
+MyObjMgr()->DisplayObj(nomh1, dopt);
 return;  
 }
@@ -543,5 +544,5 @@
 {
 NObjMgrAdapter* obja=NULL;
-obja = mOmg->GetObjAdapter(nom);
+obja = MyObjMgr()->GetObjAdapter(nom);
 if (obja == NULL) {
   cout << "Services2NObjMgr::ProjectH2() Error , No such object " << nom << endl; 
@@ -553,5 +554,5 @@
 NTuple* nt = NULL;
 AnyDataObj* oh = NULL;
-if (nomh2.length() > 0)  oh=mOmg->GetObj(nomh2);
+if (nomh2.length() > 0)  oh=MyObjMgr()->GetObj(nomh2);
 else nomh2 = "/tmp/projh2d";
 if ( (oh != NULL) && (typeid(*oh) == typeid(Histo2D)) )  h2 = (Histo2D*)oh;  // Pas de remise a zero ! h2->Zero();
@@ -581,8 +582,8 @@
     }
   delete nt;
-  mOmg->AddObj(h2, nomh2);
-  }
-
-mOmg->DisplayObj(nomh2, dopt);
+  MyObjMgr()->AddObj(h2, nomh2);
+  }
+
+MyObjMgr()->DisplayObj(nomh2, dopt);
 return;  
 
@@ -604,5 +605,5 @@
 {
 NObjMgrAdapter* obja=NULL;
-obja = mOmg->GetObjAdapter(nom);
+obja = MyObjMgr()->GetObjAdapter(nom);
 if (obja == NULL) {
   cout << "Services2NObjMgr::ProjectHProf() Error , No such object " << nom << endl; 
@@ -614,5 +615,5 @@
 NTuple* nt = NULL;
 AnyDataObj* oh = NULL;
-if (nomprof.length() > 0)  oh=mOmg->GetObj(nomprof);
+if (nomprof.length() > 0)  oh=MyObjMgr()->GetObj(nomprof);
 else nomprof = "/tmp/projprof";
 if( (oh!=NULL) && (typeid(*oh) == typeid(HProf)) )  hprof = (HProf*)oh;
@@ -641,9 +642,9 @@
     }
   delete nt;
-  mOmg->AddObj(hprof, nomprof);
+  MyObjMgr()->AddObj(hprof, nomprof);
   }
 hprof->UpdateHisto();
 
-mOmg->DisplayObj(nomprof, dopt);
+MyObjMgr()->DisplayObj(nomprof, dopt);
 return;
 }
@@ -655,5 +656,5 @@
 {
 NObjMgrAdapter* obja=NULL;
-obja = mOmg->GetObjAdapter(nom);
+obja = MyObjMgr()->GetObjAdapter(nom);
 if (obja == NULL) {
   cout << "Services2NObjMgr::FillVect() Error , No such object: " << nom << endl; 
@@ -664,5 +665,5 @@
 Vector* v1 = NULL;
 AnyDataObj* ov = NULL; 
-ov=mOmg->GetObj(nomvec);
+ov=MyObjMgr()->GetObj(nomvec);
 if (ov != NULL) v1 = dynamic_cast<Vector *>(ov);
 if (v1 == NULL) {
@@ -695,5 +696,5 @@
   
 
-mOmg->DisplayObj(nomvec, dopt);
+MyObjMgr()->DisplayObj(nomvec, dopt);
 return;  
 }
@@ -704,5 +705,5 @@
 {
 NObjMgrAdapter* obja=NULL;
-obja = mOmg->GetObjAdapter(nom);
+obja = MyObjMgr()->GetObjAdapter(nom);
 if (obja == NULL) {
   cout << "Services2NObjMgr::FillMatx() Error , No such objet " << nom << endl; 
@@ -713,5 +714,5 @@
 Matrix* mtx = NULL;
 AnyDataObj* om = NULL; 
-om=mOmg->GetObj(nommtx);
+om=MyObjMgr()->GetObj(nommtx);
 if (om != NULL) mtx = dynamic_cast<Matrix *>(om);
 if (mtx == NULL) {
@@ -746,5 +747,5 @@
   
 
-mOmg->DisplayObj(nommtx, dopt);
+MyObjMgr()->DisplayObj(nommtx, dopt);
 return;  
 
@@ -756,5 +757,5 @@
 {
 NObjMgrAdapter* obja=NULL;
-obja = mOmg->GetObjAdapter(nom);
+obja = MyObjMgr()->GetObjAdapter(nom);
 if (obja == NULL) {
   cout << "Services2NObjMgr::ExpressionToVector() Error , No such object " << nom << endl; 
@@ -789,6 +790,6 @@
   }
 delete nt;
-mOmg->AddObj(vec, nomvec); 
-mOmg->DisplayObj(nomvec, dopt);
+MyObjMgr()->AddObj(vec, nomvec); 
+MyObjMgr()->DisplayObj(nomvec, dopt);
 return;  
 }
@@ -801,5 +802,5 @@
 //	les sur-numeraires sont mises a "def_val" par defaut.
 {
-AnyDataObj* mobj = mOmg->GetObj(nom);
+AnyDataObj* mobj = MyObjMgr()->GetObj(nom);
 if(mobj == NULL)
   {cout<<"NtFromASCIIFile() Error, object "<<nom<<" not existing"<<endl;
@@ -820,5 +821,5 @@
 {
 NObjMgrAdapter* obja=NULL;
-obja = mOmg->GetObjAdapter(nom);
+obja = MyObjMgr()->GetObjAdapter(nom);
 if (obja == NULL) {
   cout << "Services2NObjMgr::FillNT() Error , No such object " << nom << endl; 
@@ -830,5 +831,5 @@
 NTuple* nt = NULL;
 AnyDataObj* oh = NULL;
-if (nomnt.length() > 0)  oh=mOmg->GetObj(nomnt);
+if (nomnt.length() > 0)  oh=MyObjMgr()->GetObj(nomnt);
 else nomnt = "/tmp/fillnt";
 if ( (oh != NULL) && (typeid(*oh) == typeid(NTuple)) )  { 
@@ -847,5 +848,5 @@
 ComputeExpressions(obja, expx, expy, expz, expt, expcut, loop, nt, NULL, NULL);
 
-if (fgnnt) mOmg->AddObj(nt, nomnt);
+if (fgnnt) MyObjMgr()->AddObj(nt, nomnt);
 return;  
 
@@ -859,5 +860,5 @@
 
 NObjMgrAdapter* obja=NULL;
-obja = mOmg->GetObjAdapter(nom);
+obja = MyObjMgr()->GetObjAdapter(nom);
 if (obja == NULL) {
   cout << "Services2NObjMgr::FillNTFrCFile( " << nom << "...) No such object" <<endl;
@@ -882,5 +883,5 @@
 if (nomnt.length() > 0) {
   AnyDataObj* oh = NULL;
-  oh=mOmg->GetObj(nomnt);
+  oh=MyObjMgr()->GetObj(nomnt);
   if ( (oh != NULL) && (typeid(*oh) == typeid(NTuple)) )  { 
     nt = (NTuple*)oh;
@@ -953,5 +954,5 @@
 mImgapp->RedirectStdOutErr(red);
 
-if (fgnnt) mOmg->AddObj(nt, nomnt);
+if (fgnnt) MyObjMgr()->AddObj(nt, nomnt);
 return;
 }
@@ -962,5 +963,5 @@
 {
 NObjMgrAdapter* obja=NULL;
-obja = mOmg->GetObjAdapter(nom);
+obja = MyObjMgr()->GetObjAdapter(nom);
 if (obja == NULL) {
   cout << "Services2NObjMgr::PrepareNTExpressionCFile( " << nom << "...) No such object" <<endl;
@@ -1044,5 +1045,5 @@
 {
 NObjMgrAdapter* obja=NULL;
-obja = mOmg->GetObjAdapter(nom);
+obja = MyObjMgr()->GetObjAdapter(nom);
 if (obja == NULL) {
   cout << "Services2NObjMgr::FillGFD() Error , No such object "<<nom<<endl;
@@ -1082,5 +1083,5 @@
 // Menage et table d'objets
 delete nt;
-mOmg->AddObj(gfd, nomgfd);
+MyObjMgr()->AddObj(gfd, nomgfd);
 return;
 }
@@ -1154,5 +1155,5 @@
 // Menage et table d'objets
 if( omg.GetObj(nomgfd) != NULL ) omg.DelObj(nomgfd);
-mOmg->AddObj(gfd,nomgfd);
+MyObjMgr()->AddObj(gfd,nomgfd);
 return;
 }
Index: /trunk/SophyaPI/PIext/servnobjm.h
===================================================================
--- /trunk/SophyaPI/PIext/servnobjm.h	(revision 2490)
+++ /trunk/SophyaPI/PIext/servnobjm.h	(revision 2491)
@@ -13,4 +13,5 @@
 #include <functional>
 
+#include "nobjmgr.h"
 #include "pdlmgr.h"
 #include "dlftypes.h"
@@ -31,5 +32,4 @@
 #endif
 
-class NamedObjMgr;
 class PIStdImgApp;
 class NObjMgrAdapter;
@@ -37,5 +37,5 @@
 class Services2NObjMgr {
 public:
-         	Services2NObjMgr(NamedObjMgr* omg, string& tmpdir);
+         	Services2NObjMgr(string& tmpdir);
   virtual	~Services2NObjMgr();
 
@@ -47,5 +47,9 @@
   inline void   SetImgApp(PIStdImgApp* app) {mImgapp = app; }
   void          SetTmpDir(string const & tmpdir);
-
+  inline NamedObjMgr*   MyObjMgr() 
+  { 
+    if (mOmg == NULL) mOmg = new NamedObjMgr; 
+    return mOmg; 
+  }
 // Trace de fonctions 1-D , 2-D
   virtual void  PlotFunc(string const & expfunc, string & nom, double xmin, double xmax, 
