Index: /trunk/SophyaPI/PIext/basexecut.cc
===================================================================
--- /trunk/SophyaPI/PIext/basexecut.cc	(revision 2754)
+++ /trunk/SophyaPI/PIext/basexecut.cc	(revision 2755)
@@ -53,5 +53,6 @@
 /* Macro pour tester si flag normalized coordinate est present */
 #define _CkBoolNC_(_jk_) ((tokens.size()>_jk_) && (tokens[_jk_] == "true")) ? true : false;
- 
+
+
 /* --Methode-- */
 int PIABaseExecutor::Execute(string& kw, vector<string>& tokens, string& toks)
@@ -1125,4 +1126,17 @@
 
 return(0);
+}
+
+/* --Methode-- */
+bool PIABaseExecutor::IsThreadable(string const & keyw)
+{
+  if ( (keyw == "fillvec") || (keyw == "fillmtx") || 
+       (keyw == "fillnt") || (keyw == "ntloop") )  return true;
+  else if (keyw.substr(0,4) == "func")  return true;
+  else {
+    string skw = keyw.substr(0,5);
+    if ( (skw == "plot2") || (skw == "plot3") || (skw == "projh") )  return true; 
+  } 
+  return false;	
 }
 
Index: /trunk/SophyaPI/PIext/basexecut.h
===================================================================
--- /trunk/SophyaPI/PIext/basexecut.h	(revision 2754)
+++ /trunk/SophyaPI/PIext/basexecut.h	(revision 2755)
@@ -14,4 +14,5 @@
   virtual	~PIABaseExecutor();
   virtual int	Execute(string& keyw, vector<string>& args, string& toks);
+  virtual bool  IsThreadable(string const & keyw);
 
 protected :
Index: /trunk/SophyaPI/PIext/cxxexecutor.cc
===================================================================
--- /trunk/SophyaPI/PIext/cxxexecutor.cc	(revision 2754)
+++ /trunk/SophyaPI/PIext/cxxexecutor.cc	(revision 2755)
@@ -155,4 +155,7 @@
     return(1);
   }
+  // Pour synchronisation d'execution simultanee
+  ZSync zs(mutx_cxxe, 2);  zs.NOp(); // 2 -> broadcast lors de la destruction
+
   rc = ExecuteCXX(toks); if(rc) return(1);
 
@@ -162,4 +165,7 @@
     return(1);
   }
+  // Pour synchronisation d'execution simultanee
+  ZSync zs(mutx_cxxe, 2);  zs.NOp(); // 2 -> broadcast lors de la destruction
+
   rc = FillUserCode(tokens[0]); if(rc) return(1);
   if(tokens.size()>1) rc = FillUserFctFrF(tokens[1]);
@@ -181,4 +187,7 @@
     return(1);
   }
+  // Pour synchronisation d'execution simultanee
+  ZSync zs(mutx_cxxe, 2);  zs.NOp(); // 2 -> broadcast lors de la destruction
+
   rc = FillUserCode(toks,2);        if(rc) return(1);
   rc = FillUserFctFrS();            if(rc) return(1);
@@ -190,4 +199,7 @@
     return(1);
   }
+  // Pour synchronisation d'execution simultanee
+  ZSync zs(mutx_cxxe, 2);  zs.NOp(); // 2 -> broadcast lors de la destruction
+
   rc = FillUserCode(tokens[2]); if(rc) return(1);
   if(tokens.size()>3) rc = FillUserFctFrF(tokens[3]);
@@ -197,4 +209,7 @@
 
 } else if(kw == "c++compile") {
+  // Pour synchronisation d'execution simultanee
+  ZSync zs(mutx_cxxe, 2);  zs.NOp(); // 2 -> broadcast lors de la destruction
+
   if(tokens.size()>=1) rc = Compile(tokens[0]);
   else                 rc = Compile();
@@ -202,4 +217,7 @@
 
 } else if(kw == "c++link") {
+  // Pour synchronisation d'execution simultanee
+  ZSync zs(mutx_cxxe, 2);  zs.NOp(); // 2 -> broadcast lors de la destruction
+
   if(tokens.size()>=2)      rc = Link(tokens[0],tokens[1]);
   else if(tokens.size()>=1) rc = Link(tokens[0]);
@@ -262,4 +280,13 @@
 
 return(0);
+}
+
+/* --Methode-- */
+bool  CxxExecutor::IsThreadable(string const & kw)
+{
+if ( (kw == "c++exec") || (kw == "c++execfrf") || 
+     (kw == "c++create") || (kw == "c++createfrf") ||
+     (kw == "c++compile") || (kw == "c++link") )   return true;
+else return false;
 }
 
Index: /trunk/SophyaPI/PIext/cxxexecutor.h
===================================================================
--- /trunk/SophyaPI/PIext/cxxexecutor.h	(revision 2754)
+++ /trunk/SophyaPI/PIext/cxxexecutor.h	(revision 2755)
@@ -24,4 +24,5 @@
 
   virtual int Execute(string& keyw,vector<string>& args, string& toks);
+  virtual bool  IsThreadable(string const & keyw);
 
   inline void SetPrtLevel(uint_2 lp=2) {mPrtLevel = lp;}
@@ -96,4 +97,8 @@
   uint_2 mPrtLevel;
   bool   mFgPutVar;  // if true , declare ObjMgr variables as $varname, default=false
+
+  // Mutex de controle de thread pour dynamic-link 
+  ZMutex mutx_cxxe;
+
 };
 
Index: /trunk/SophyaPI/PIext/nobjmgr.cc
===================================================================
--- /trunk/SophyaPI/PIext/nobjmgr.cc	(revision 2754)
+++ /trunk/SophyaPI/PIext/nobjmgr.cc	(revision 2755)
@@ -95,8 +95,8 @@
 static DVList* myVars = NULL;  // Pour stocker les variables
 
-static string* TmpDir;  // Repertoire pour les compilations / link dynamique
+static string* TmpDir = NULL;  // Repertoire pour les compilations / link dynamique
 
 // Pour gestion multithread 
-static ZMutex* myMutex;
+static ZMutex* myMutex = NULL;
 // ..................................................................
 
@@ -122,4 +122,5 @@
   myObjs = new NObjList;  
   myVars = new DVList;
+  myMutex = new ZMutex;
   currDir = new string("home");
   string dirn = "home";
@@ -144,5 +145,4 @@
   if ( (l>0) && ((*TmpDir)[l-1] != '/') )  (*TmpDir) += '/';
   servnobjm = new Services2NObjMgr(*TmpDir);
-  myMutex = new ZMutex;
   }
 fgOInit++;
@@ -230,5 +230,5 @@
     return(false);
   }
-  ZSync(*myMutex);
+  ZSync zs(*myMutex); zs.NOp(); 
 #ifdef SANS_EVOLPLANCK
   bool fg = true;
@@ -248,5 +248,5 @@
     return(false);
   }
-  ZSync(*myMutex);
+  ZSync zs(*myMutex); zs.NOp(); 
 #ifdef SANS_EVOLPLANCK
   DVList::ValList::const_iterator it;
@@ -266,5 +266,5 @@
     return(false);
   }
-  ZSync(*myMutex);
+  ZSync zs(*myMutex); zs.NOp(); 
 #ifdef SANS_EVOLPLANCK
   return(false);
@@ -281,5 +281,5 @@
     return("");
   }
-  ZSync(*myMutex);
+  ZSync zs(*myMutex); zs.NOp(); 
   //  cout << " DEBUG::GetVar " << *myVars << endl;
   return(myVars->GetS(key));
@@ -290,5 +290,5 @@
 {
   //  cout << " DEBUG::GetVarList " << *myVars << endl;
-  ZSync(*myMutex);
+  ZSync zs(*myMutex); zs.NOp(); 
   return(*myVars);
 }
@@ -297,5 +297,5 @@
 bool NamedObjMgr::CreateDir(string & dirname)
 {
-  ZSync(*myMutex);
+  ZSync zs(*myMutex); zs.NOp(); 
   return CreateDir_P(dirname);
 }
@@ -337,5 +337,5 @@
   return(false); 
   }
-ZSync(*myMutex);
+ZSync zs(*myMutex); zs.NOp(); 
 NObjDirList::iterator it = myDirs->find(dirname);
 if (it == myDirs->end()) {
@@ -369,5 +369,5 @@
 void NamedObjMgr::LockDir(string & dirname)
 {
-ZSync(*myMutex);
+ZSync zs(*myMutex); zs.NOp(); 
 if ( !CheckDirName(dirname) ) return;
 NObjDirList::iterator it = myDirs->find(dirname);
@@ -381,5 +381,5 @@
 void NamedObjMgr::UnlockDir(string & dirname)
 {
-ZSync(*myMutex);
+ZSync zs(*myMutex); zs.NOp(); 
 if ( !CheckDirName(dirname) ) return;
 NObjDirList::iterator it = myDirs->find(dirname);
@@ -393,5 +393,5 @@
 void NamedObjMgr::SetKeepOldDirAtt(string & dirname, bool keepold)
 {
-ZSync(*myMutex);
+ZSync zs(*myMutex); zs.NOp(); 
 if ( !CheckDirName(dirname) ) return;
 NObjDirList::iterator it = myDirs->find(dirname);
@@ -409,5 +409,5 @@
 bool NamedObjMgr::SetCurrentDir(string & dirname)
 {
-ZSync(*myMutex);
+ZSync zs(*myMutex); zs.NOp(); 
 if ( !CheckDirName(dirname) ) {
   cout << "NamedObjMgr::SetCurrentDir( " << dirname << ") Error - Invalid name !" << endl;
@@ -427,5 +427,5 @@
 void NamedObjMgr::GetCurrentDir(string & dirname)
 {
-ZSync(*myMutex);
+ZSync zs(*myMutex); zs.NOp(); 
 dirname = *currDir;
 }
@@ -434,5 +434,5 @@
 void NamedObjMgr::ListDirs(string & patt)
 {
-ZSync(*myMutex);
+ZSync zs(*myMutex); zs.NOp(); 
 NObjDirList::iterator it;
 string cn;
@@ -454,5 +454,5 @@
 void NamedObjMgr::GetDirList(string & patt, vector<string>& lstd)
 {
-ZSync(*myMutex);
+ZSync zs(*myMutex); zs.NOp(); 
 NObjDirList::iterator it;
 string cn;
@@ -467,5 +467,5 @@
 void NamedObjMgr::CleanDir(string & dirname)
 {
-ZSync(*myMutex);
+ZSync zs(*myMutex); zs.NOp(); 
 CleanDir_P(dirname);
 }
@@ -533,5 +533,5 @@
 bool NamedObjMgr::AddObj(AnyDataObj* obj, string & nom, bool crd)
 {
-  ZSync(*myMutex);
+  ZSync zs(*myMutex); zs.NOp(); 
   return AddObj_P(obj, nom, crd);
 }
@@ -625,5 +625,5 @@
 bool NamedObjMgr::AddObj(AnyDataObj& obj, string & nom, bool crd)
 {
-ZSync(*myMutex);
+ZSync zs(*myMutex); zs.NOp(); 
 NObjMgrAdapter* adap = GetServiceObj()->GetAdapter(&obj);
 if (adap == NULL) {
@@ -643,5 +643,5 @@
 bool NamedObjMgr::RenameObj(string & nom, string& nomnew)
 {
-  ZSync(*myMutex);
+  ZSync zs(*myMutex); zs.NOp(); 
   return RenameObj_P(nom, nomnew);
 }
@@ -710,9 +710,9 @@
 bool NamedObjMgr::CopyObj(string & nom, string& nomcp)
 {
-ZSync(*myMutex);
+ZSync zs(*myMutex); zs.NOp(); 
 if(nomcp.length()<=0)
   {cout<<"NamedObjMgr::CopyObj() Error, copied obj name "<<nomcp<<" not valid"<<endl;
   return(false);}
-NObjMgrAdapter* obnom = GetObjAdapter(nom);
+NObjMgrAdapter* obnom = GetObjAdapter_P(nom);
 if(obnom==NULL)
   {cout<<"NamedObjMgr::CopyObj() Error -  No "<<nom<<" object !"<<endl;
@@ -727,5 +727,5 @@
 bool NamedObjMgr::DelObj(string & nom, bool fgd)
 {
-  ZSync(*myMutex);
+  ZSync zs(*myMutex); zs.NOp(); 
   return DelObj_P(nom, fgd);
 }
@@ -778,5 +778,5 @@
 bool NamedObjMgr::DelObj_Id(int oid)
 {
-ZSync(*myMutex);
+ZSync zs(*myMutex); zs.NOp(); 
 NObjList::iterator it;
 string nom;
@@ -794,5 +794,5 @@
 void NamedObjMgr::DelObjects(string & patt, bool fgd)
 {
-ZSync(*myMutex);
+ZSync zs(*myMutex); zs.NOp(); 
 string n1,r1;
 ParseObjectName(patt, r1, n1);
@@ -812,5 +812,11 @@
 AnyDataObj* NamedObjMgr::GetObj(string & nom)
 {
-ZSync(*myMutex);
+ZSync zs(*myMutex); zs.NOp(); 
+return GetObj_P(nom);
+}
+
+/* --Methode-- */
+AnyDataObj* NamedObjMgr::GetObj_P(string & nom)
+{
 string n1,r1;
 ParseObjectName(nom, r1, n1);
@@ -824,5 +830,11 @@
 NObjMgrAdapter* NamedObjMgr::GetObjAdapter(string & nom)
 {
-ZSync(*myMutex);
+ZSync zs(*myMutex); zs.NOp(); 
+return GetObjAdapter_P(nom);
+}
+
+/* --Methode-- */
+NObjMgrAdapter* NamedObjMgr::GetObjAdapter_P(string & nom)
+{
 string n1,r1;
 ParseObjectName(nom, r1, n1);
@@ -836,5 +848,5 @@
 void NamedObjMgr::ListObjs(string & patt)
 {
-ZSync(*myMutex);
+ZSync zs(*myMutex); zs.NOp(); 
 int k;
 AnyDataObj* obj=NULL;
@@ -865,5 +877,5 @@
 void NamedObjMgr::GetObjList(string & patt, vector<string> &lst)
 {
-ZSync(*myMutex);
+ZSync zs(*myMutex); zs.NOp(); 
 string n1,r1;
 if (patt.length() < 1)  return;
@@ -901,5 +913,5 @@
 void NamedObjMgr::ReadObj(string const & flnm, string & nobj)
 {
-ZSync(*myMutex);
+ZSync zs(*myMutex); zs.NOp(); 
 PPersist* ppobj=NULL;
 bool ok = true;
@@ -934,5 +946,5 @@
 {
 if(flnm_objname.size()<2) return;
-ZSync(*myMutex);
+ZSync zs(*myMutex); zs.NOp(); 
 int nread=0;
 try {
@@ -963,5 +975,11 @@
 void NamedObjMgr::ReadObj(PInPersist& s, int num)
 {
-ZSync(*myMutex);
+ZSync zs(*myMutex); zs.NOp();
+ReadObj_P(s, num); 
+}
+
+/* --Methode-- */
+void NamedObjMgr::ReadObj_P(PInPersist& s, int num)
+{
 int_4 i; // $CHECK$ int -> int_4 a cause de TagKey
 #ifdef SANS_EVOLPLANCK
@@ -1046,5 +1064,5 @@
 void NamedObjMgr::ReadAll(string const & flnm)
 {
-ZSync(*myMutex);
+ZSync zs(*myMutex); zs.NOp(); 
 #ifdef SANS_EVOLPLANCK
 bool ok = true;
@@ -1065,5 +1083,5 @@
   AddObj_P(obj->DataObj(), nom, false);
   }
-else ReadObj((*ppin), -1);
+else ReadObj_P((*ppin), -1);
 delete ppin;
 #else
@@ -1077,5 +1095,5 @@
       cout << " ... Reading " << pis.NbNameTags() << " objects at NameTags " ;
     }
-    ReadObj(pis, -1);
+    ReadObj_P(pis, -1);
     return;
   }
@@ -1101,5 +1119,5 @@
 void NamedObjMgr::ReadFits(string const & flnm, string & nobj)
 {
-ZSync(*myMutex);
+ZSync zs(*myMutex); zs.NOp(); 
 #ifdef SANS_EVOLPLANCK 
 bool ok = false;
@@ -1161,5 +1179,5 @@
 void NamedObjMgr::SaveObj(string & nom, POutPersist& s, bool keeppath)
 {
-  ZSync(*myMutex);
+  ZSync zs(*myMutex); zs.NOp(); 
   SaveObj_P(nom, s, keeppath);
 }
@@ -1175,5 +1193,5 @@
 NObjMgrAdapter* obja=NULL;
 string nomf = (keeppath) ? nom : nob;
-obja = GetObjAdapter(nom);
+obja = GetObjAdapter_P(nom);
 if (obja == NULL)  return;
 printf("NamedObjMgr::SaveObj(%s, )  (Type=%s) \n",  
@@ -1186,5 +1204,5 @@
 void NamedObjMgr::SaveObjects(string & patt, string const& flnm)
 {
-ZSync(*myMutex);
+ZSync zs(*myMutex); zs.NOp(); 
 string n1,r1;
 if (patt.length() < 1)  return;
@@ -1228,5 +1246,5 @@
 // dont le nom est le dernier argument (liste[n-1])
 {
- ZSync(*myMutex);
+ ZSync zs(*myMutex); zs.NOp(); 
 
  if(liste.size()<2) {
@@ -1260,5 +1278,5 @@
 void NamedObjMgr::SaveAll(string const& flnm)
 {
-ZSync(*myMutex);
+ZSync zs(*myMutex); zs.NOp(); 
 bool ok = true;
 
@@ -1293,8 +1311,8 @@
 void NamedObjMgr::SaveFits(string& nom, string const & flnm)
 {
-ZSync(*myMutex);
+ZSync zs(*myMutex); zs.NOp(); 
 
 NObjMgrAdapter* obja=NULL;
-obja = GetObjAdapter(nom);
+obja = GetObjAdapter_P(nom);
 if (obja == NULL)  return;
 cout << "  SaveFits: Object" << nom << " to FITS file " << flnm << endl; 
@@ -1308,7 +1326,7 @@
 void NamedObjMgr::PrintObj(string& nom)
 {
-ZSync(*myMutex);
+ZSync zs(*myMutex); zs.NOp(); 
 NObjMgrAdapter* obja=NULL;
-obja = GetObjAdapter(nom);
+obja = GetObjAdapter_P(nom);
 if (obja == NULL)  return;
 AnyDataObj* ob = obja->GetDataObj();
@@ -1330,8 +1348,8 @@
 if ( (dopt == "nodisp") || (dopt == "nodisplay") ) return;
 
-ZSync(*myMutex);
+ZSync zs(*myMutex); zs.NOp(); 
 
 NObjMgrAdapter* obja=NULL;
-obja = GetObjAdapter(nom);
+obja = GetObjAdapter_P(nom);
 if (obja == NULL) {
   cout << "NamedObjMgr::DisplayObj() Error , No object with name " << nom << endl; 
@@ -1380,8 +1398,8 @@
 if ( (dopt == "nodisp") || (dopt == "nodisplay") ) return;
 
-ZSync(*myMutex);
+ZSync zs(*myMutex); zs.NOp(); 
 
 NObjMgrAdapter* obja=NULL;
-obja = GetObjAdapter(nom);
+obja = GetObjAdapter_P(nom);
 if (obja == NULL) {
   cout << "NamedObjMgr::DisplayImage() Error , No such object " << nom << endl; 
@@ -1420,8 +1438,8 @@
 if ( (dopt == "nodisp") || (dopt == "nodisplay") ) return;
 
-ZSync(*myMutex);
+ZSync zs(*myMutex); zs.NOp(); 
 
 NObjMgrAdapter* obja=NULL;
-obja = GetObjAdapter(nom);
+obja = GetObjAdapter_P(nom);
 if (obja == NULL) {
   cout << "NamedObjMgr::DisplaySurf3D() Error , No such object " << nom << endl; 
@@ -1470,7 +1488,7 @@
 if ( (dopt == "nodisp") || (dopt == "nodisplay") ) return;
 
-ZSync(*myMutex);
-
-AnyDataObj* obj=GetObj(nom);
+ZSync zs(*myMutex); zs.NOp(); 
+
+AnyDataObj* obj=GetObj_P(nom);
 if (obj == NULL) {
   cout << "NamedObjMgr::DisplayNT() Error , No such object " << nom << endl; 
@@ -1536,7 +1554,7 @@
 if ( (dopt == "nodisp") || (dopt == "nodisplay") ) return;
 
-ZSync(*myMutex);
-
-AnyDataObj* obj=GetObj(nom);
+ZSync zs(*myMutex); zs.NOp(); 
+
+AnyDataObj* obj=GetObj_P(nom);
 if(obj == NULL)
   {cout << "NamedObjMgr::DisplayGFD() Error , No such object " << nom << endl; 
@@ -1592,5 +1610,5 @@
 if ( (dopt == "nodisp") || (dopt == "nodisplay") ) return;
 
-ZSync(*myMutex);
+ZSync zs(*myMutex); zs.NOp(); 
 
 #ifdef SANS_EVOLPLANCK
@@ -1601,5 +1619,5 @@
 
 AnyDataObj* obj;
-obj = GetObj(nomvx);
+obj = GetObj_P(nomvx);
 if(obj == NULL) {
   cout << "NamedObjMgr::DisplayVector() Error , No such object " << nomvx << endl; 
@@ -1613,5 +1631,5 @@
 }
 
-obj = GetObj(nomvy);
+obj = GetObj_P(nomvy);
 if(obj == NULL) {
   cout << "NamedObjMgr::DisplayVector() Error , No such object " << nomvy << endl; 
@@ -1706,5 +1724,5 @@
 {
 if (!myImgApp)  return;
-ZSync(*myMutex);
+ZSync zs(*myMutex); zs.NOp(); 
 if ( !_fgimgapp )  myImgApp->LockMutex();
 
Index: /trunk/SophyaPI/PIext/nobjmgr.h
===================================================================
--- /trunk/SophyaPI/PIext/nobjmgr.h	(revision 2754)
+++ /trunk/SophyaPI/PIext/nobjmgr.h	(revision 2755)
@@ -116,4 +116,7 @@
   virtual bool		RenameObj_P(string & nom, string& nomnew);
   virtual bool          DelObj_P(string & nom, bool fgd=true);
+  virtual AnyDataObj*	GetObj_P(string & nom);
+  virtual NObjMgrAdapter*	GetObjAdapter_P(string & nom);
+  virtual void		ReadObj_P(PInPersist& s, int num=-1);
   virtual void          SaveObj_P(string & nom, POutPersist& s, bool keeppath=false);
 
Index: /trunk/SophyaPI/PIext/pawexecut.cc
===================================================================
--- /trunk/SophyaPI/PIext/pawexecut.cc	(revision 2754)
+++ /trunk/SophyaPI/PIext/pawexecut.cc	(revision 2755)
@@ -319,4 +319,13 @@
 } else return(1); 
 }
+
+/* methode */
+bool PAWExecutor::IsThreadable(string const & keyw)
+{
+  if ( (keyw == "n/plot")  || (keyw == "n/pl") || 
+       (keyw == "n/proj") )  return true;
+  else return false;
+}
+
 
 /* methode */
@@ -435,4 +444,5 @@
 }
 
+
 /* methode */
 void PAWExecutor::n_proj(vector<string>& tokens)
@@ -630,4 +640,5 @@
 }
 
+
 /* methode */
 #define __LENLINE_N_READ__ 8192
Index: /trunk/SophyaPI/PIext/pawexecut.h
===================================================================
--- /trunk/SophyaPI/PIext/pawexecut.h	(revision 2754)
+++ /trunk/SophyaPI/PIext/pawexecut.h	(revision 2755)
@@ -19,4 +19,6 @@
   virtual     ~PAWExecutor();
   virtual int Execute(string& keyw, vector<string>& args, string& toks);
+  virtual bool  IsThreadable(string const & keyw);
+
 protected:
   void  reset(vector<string>& tokens);
Index: /trunk/SophyaPI/PIext/piacmd.cc
===================================================================
--- /trunk/SophyaPI/PIext/piacmd.cc	(revision 2754)
+++ /trunk/SophyaPI/PIext/piacmd.cc	(revision 2755)
@@ -366,5 +366,5 @@
   Commander::SetCurrentPrompt(pr);
   if (mImgApp) { 
-    ZSync(mImgApp->getMutex());
+    ZSync zs(mImgApp->getMutex()); zs.NOp(); 
     mImgApp->GetConsole()->SetPrompt(pr);
   }
@@ -378,5 +378,5 @@
   char va = (att == 0) ? 0 : PIVA_Magenta;
   if (mImgApp) { 
-    ZSync(mImgApp->getMutex());
+    ZSync(mImgApp->getMutex()); zs.NOp(); 
     mImgApp->GetConsole()->AddStr(msg, va);
   }
Index: /trunk/SophyaPI/PIext/pintuple.cc
===================================================================
--- /trunk/SophyaPI/PIext/pintuple.cc	(revision 2754)
+++ /trunk/SophyaPI/PIext/pintuple.cc	(revision 2755)
@@ -198,16 +198,25 @@
 npolyg = 0;
 NptDraw = 0;
+
+// Mai 2005: Correction bug trace des lignes avec le pts en dehors de la zone (Reza)
+// flags pour la gestion des points/lignes a tracer
+bool fgokcurpt = true;  // Point courant dans la zone a tracer
+bool fgoklastpt = true;   // Le dernier point etait dans la zone a tracer
 for (long i=0; i<(long)mNT->NbLines(); i++) {
-  xl = xp;  yl = yp;
+  xl = xp;  yl = yp; fgoklastpt = fgokcurpt;
+
   xp = mNT->GetCell(i, xK);
   yp = mNT->GetCell(i, yK);
-  if ( (xp < xmin2) || (xp > xmax2) || (yp < ymin2) || (yp > ymax2) )  continue;
-  nok++;
-  if ( (xp < xmin) || (xp > xmax) || (yp < ymin) || (yp > ymax) )  continue;
-
-  NptDraw++;
+
+  // Comptage du nombre de pts dans la zone graphique du widget
+  if ( !((xp < xmin2) || (xp > xmax2) || (yp < ymin2) || (yp > ymax2)) )  nok++;
+  // Gestion des limites a tracer
+  fgokcurpt = true;
+  if ( (xp < xmin) || (xp > xmax) || (yp < ymin) || (yp > ymax) ) fgokcurpt = false;
+  else NptDraw++;
+
 // Taille - couleur de marker en fonction du poids
-  if (wK >= 0) wp = mNT->GetCell(i, wK);
-  if (mrkSzScale && (wK >= 0)) {  // Changement de taille
+  if ( fgokcurpt &&(wK >= 0) ) wp = mNT->GetCell(i, wK);
+  if ( fgokcurpt && mrkSzScale && (wK >= 0) ) {  // Changement de taille
     sz = (int)((wp-wMin)/dw);
     if (sz < 0) sz = 0;
@@ -218,5 +227,5 @@
   }
 // Couleur du marker en fonction du poids
-  if( colorScale && (wK >= 0) && cmap ) {
+  if( fgokcurpt && colorScale && (wK >= 0) && cmap ) {
     int cid = (int)((wp-wMin)/dwc);
     if (cid < 0) cid = 0;
@@ -227,17 +236,24 @@
   // Trace d'une ligne reliant les points
   if( connectPts ) {
-    if((npolyg==0) && (i>0)) {xpolyg[0]=xl; ypolyg[0]=yl; npolyg=1;}
-    if(npolyg<NMXMULTP_LOCAL)
+    // On initialise le polygone avec le dernier point, si ce dernier ok
+    if((npolyg==0) && (i>0) && fgokcurpt) {xpolyg[0]=xl; ypolyg[0]=yl; npolyg=1;}
+    // On ajoute le point courant au polygone - sauf si celui-ci est vide
+    if((npolyg<NMXMULTP_LOCAL) && (npolyg>0))
       {xpolyg[npolyg]=xp; ypolyg[npolyg]=yp; npolyg++;}
-    if(npolyg==NMXMULTP_LOCAL)
+    // On trace le polygone s'il est plein - ou le point courant en dehors
+    // (point courant en dehors -> discontinuite de la ligne 
+    if( !fgokcurpt || (npolyg==NMXMULTP_LOCAL) )
       {g->DrawPolygon(xpolyg,ypolyg,npolyg,false); npolyg=0;}
   }
 
+  // Plus rien a faire si point en dehors -- on s'en va 
+  if (!fgokcurpt)  continue;
+
   // Trace des erreurs selon X et Y
-  if ( xebK >= 0 ) {
+  if (xebK >= 0) {
     xer = mNT->GetCell(i, xebK);
     if(xer>0.) g->DrawLine(xp-xer, yp, xp+xer, yp);
   }
-  if ( yebK >= 0 ) {
+  if (yebK >= 0) {
     yer = mNT->GetCell(i, yebK);
     if(yer>0.) g->DrawLine(xp, yp-yer, xp, yp+yer);
Index: /trunk/SophyaPI/PIext/pistdimgapp.cc
===================================================================
--- /trunk/SophyaPI/PIext/pistdimgapp.cc	(revision 2754)
+++ /trunk/SophyaPI/PIext/pistdimgapp.cc	(revision 2755)
@@ -1035,5 +1035,5 @@
 {
 // <ZThread> global PIApplication event loop synchronisation
-ZSync zs(thr_glsyn, 2);  
+ZSync zs(thr_glsyn, 2);  zs.NOp(); 
 
 PIDrawer *eld=CurrentElDrawer();
@@ -1062,5 +1062,5 @@
 {
 // <ZThread> global PIApplication event loop synchronisation
-ZSync zs(thr_glsyn, 2);  
+ZSync zs(thr_glsyn, 2);  zs.NOp(); 
 
 PIDrawer *eld=CurrentElDrawer();
@@ -1090,5 +1090,5 @@
 {
 // <ZThread> global PIApplication event loop synchronisation
-ZSync zs(thr_glsyn, 2);  
+ZSync zs(thr_glsyn, 2);  zs.NOp(); 
 
 PIDrawer *eld=CurrentElDrawer();
@@ -1116,5 +1116,5 @@
 {
 // <ZThread> global PIApplication event loop synchronisation
-ZSync zs(thr_glsyn, 2);  
+ZSync zs(thr_glsyn, 2);  zs.NOp(); 
 
 PIDrawer *eld=CurrentElDrawer();
@@ -1156,5 +1156,5 @@
 {
 // <ZThread> global PIApplication event loop synchronisation
-ZSync zs(thr_glsyn, 2);  
+ZSync zs(thr_glsyn, 2);  zs.NOp(); 
 
 PIDrawer *eld=CurrentElDrawer();
@@ -1183,5 +1183,5 @@
 {
 // <ZThread> global PIApplication event loop synchronisation
-ZSync zs(thr_glsyn, 2);  
+ZSync zs(thr_glsyn, 2);  zs.NOp(); 
 
 PIDrawer *eld=CurrentElDrawer();
@@ -1209,5 +1209,5 @@
 {
 // <ZThread> global PIApplication event loop synchronisation
-ZSync zs(thr_glsyn, 2);  
+ZSync zs(thr_glsyn, 2);  zs.NOp(); 
 
 PIDrawer *eld=CurrentElDrawer();
@@ -1233,5 +1233,5 @@
 {
 // <ZThread> global PIApplication event loop synchronisation
-ZSync zs(thr_glsyn, 2);  
+ZSync zs(thr_glsyn, 2);  zs.NOp(); 
 
 PIDrawer *eld=CurrentElDrawer();
@@ -1259,5 +1259,5 @@
 {
 // <ZThread> global PIApplication event loop synchronisation
-ZSync zs(thr_glsyn, 2);  
+ZSync zs(thr_glsyn, 2);  zs.NOp(); 
 
 PIDrawer *eld=CurrentElDrawer();
@@ -1286,5 +1286,5 @@
 {
 // <ZThread> global PIApplication event loop synchronisation
-ZSync zs(thr_glsyn, 2);  
+ZSync zs(thr_glsyn, 2);  zs.NOp(); 
 
 PIDrawer *eld=CurrentElDrawer();
@@ -1312,5 +1312,5 @@
 {
 // <ZThread> global PIApplication event loop synchronisation
-ZSync zs(thr_glsyn, 2);  
+ZSync zs(thr_glsyn, 2);  zs.NOp(); 
 
 PIDrawer *eld=CurrentElDrawer();
Index: /trunk/SophyaPI/PIext/servnobjm.cc
===================================================================
--- /trunk/SophyaPI/PIext/servnobjm.cc	(revision 2754)
+++ /trunk/SophyaPI/PIext/servnobjm.cc	(revision 2755)
@@ -107,4 +107,7 @@
 if (!mImgapp)  return; 
 
+// Pour synchronisation d'execution simultanee
+ZSync zs(mutx_dynlink, 2);  zs.NOp(); // 2 -> broadcast lors de la destruction
+
 cmd = "rm -f " + fname;
 rc = system(cmd.c_str());
@@ -141,4 +144,6 @@
 
 if (!mImgapp)  return; 
+// Pour synchronisation d'execution simultanee
+ZSync zs(mutx_dynlink, 2);  zs.NOp(); // 2 -> broadcast lors de la destruction
 
 cmd = "rm " + fname;
@@ -170,4 +175,6 @@
                                        double xmin, double xmax, int np, string dopt)
 {
+// Pour synchronisation d'execution simultanee
+ZSync zs(mutx_dynlink, 2);  zs.NOp(); // 2 -> broadcast lors de la destruction
 DlFunctionOfX f = (DlFunctionOfX) LinkFunctionFromFile(fname, func);
 if (!f) return; 
@@ -181,4 +188,6 @@
                                          double xmin, double xmax, double ymin, double ymax, int npx, int npy, string dopt)
 {
+// Pour synchronisation d'execution simultanee
+ZSync zs(mutx_dynlink, 2);  zs.NOp(); // 2 -> broadcast lors de la destruction
 DlFunctionOfXY f = (DlFunctionOfXY) LinkFunctionFromFile(fname, func);
 if (!f)  return;
@@ -884,4 +893,7 @@
   }
 
+// Pour synchronisation d'execution simultanee
+ZSync zs(mutx_dynlink, 2);  zs.NOp(); // 2 -> broadcast lors de la destruction
+
 NTLoopExprFunc f = (NTLoopExprFunc)LinkFunctionFromFile(fname, funcname);
 if (!f) { 
@@ -1177,4 +1189,7 @@
 if (objnt == NULL)  return;
 string  vardec = objnt->VarList_C("_zz6qi_");
+
+// Pour synchronisation d'execution simultanee
+ZSync zs(mutx_dynlink, 2);  zs.NOp(); // 2 -> broadcast lors de la destruction
 
 PlotExprFunc f = LinkExprFunc(vardec, expx, expy, expz, expt, expcut);
Index: /trunk/SophyaPI/PIext/servnobjm.h
===================================================================
--- /trunk/SophyaPI/PIext/servnobjm.h	(revision 2754)
+++ /trunk/SophyaPI/PIext/servnobjm.h	(revision 2755)
@@ -17,4 +17,6 @@
 #include "dlftypes.h"
 #include "anydataobj.h"
+
+#include "zthread.h"
 
 #ifdef SANS_EVOLPLANCK
@@ -135,7 +137,10 @@
   PDynLinkMgr * dynlink;  // shared-lib lib.so
   string TmpDir;          // Pour fichiers temporaires
+  // Mutex de controle de thread pour dynamic-link 
+  ZMutex mutx_dynlink;
 
   PIStdImgApp* mImgapp;
   NamedObjMgr* mOmg;
+
   
 };
