Index: /trunk/SophyaPI/PIext/piafitting.cc
===================================================================
--- /trunk/SophyaPI/PIext/piafitting.cc	(revision 2814)
+++ /trunk/SophyaPI/PIext/piafitting.cc	(revision 2815)
@@ -205,4 +205,7 @@
 , mUFNVar(0), mUFNPar(0)
 {
+// Flag de controle d'execution depuis la boucle d'evts
+  SetFgEvtLoopFlag(false);
+
 // Init et Set des options
 mPar=0.; mStep=1.; mMin=1.; mMax=-1.; mFix=0.;
@@ -496,5 +499,10 @@
 {
 mNObj = "";
-AnyDataObj* mobj = mApp->ObjMgr()->GetObj(obj);
+AnyDataObj* mobj = NULL; 
+if ( fg_evtloop )  mobj = mApp->ObjMgr()->GetObj(obj);
+else {
+  NamedObjMgr omg;
+  mobj = omg.GetObj(obj);
+}
 if(mobj == NULL)
   {cout<<"PIAFitter::DecodeObject Error , Pas d'objet de nom "<<obj<<endl;
@@ -540,5 +548,11 @@
 mNVar = mNData = 0;
 
-mAdObj = mApp->ObjMgr()->GetObjAdapter(mNObj); // Ne pas deleter
+mAdObj = NULL;
+if ( fg_evtloop )  mAdObj = mApp->ObjMgr()->GetObjAdapter(mNObj); // Ne pas deleter
+else {
+  NamedObjMgr omg;
+  mAdObj = omg.GetObjAdapter(mNObj); // Ne pas deleter
+}
+
 if(mAdObj == NULL) {
   cout<<"PIAFitter::DecodeObject Error , ObjAdapter==NULL for "<<mNObj<<endl;
@@ -874,5 +888,11 @@
   nomresfun = mNObj + "_res";
   AnyDataObj* ob = mAdObj->FitResidusObj(*mFit);
-  if(ob) mApp->ObjMgr()->AddObj(ob,nomresfun);
+  if(ob) { 
+    if ( fg_evtloop )  mApp->ObjMgr()->AddObj(ob,nomresfun);
+    else {
+      NamedObjMgr omg;
+      omg.AddObj(ob,nomresfun);
+    }
+  }
 }
 
@@ -880,5 +900,11 @@
   nomresfun = mNObj + "_fun";
   AnyDataObj* ob = mAdObj->FitFunctionObj(*mFit);
-  if(ob) mApp->ObjMgr()->AddObj(ob,nomresfun);
+  if(ob) { 
+    if ( fg_evtloop )  mApp->ObjMgr()->AddObj(ob,nomresfun);
+    else {
+      NamedObjMgr omg;
+      omg.AddObj(ob,nomresfun);
+    }
+  }
 }
 
@@ -1054,7 +1080,12 @@
 DecodeParam(mSp,mSs,mSm,mSM,mSf);
 if(kw == "fit") {
+  ZSync zs(getMutex());   // On s'assure 
+  SetFgEvtLoopFlag(false);  // l'origine n'est pas la boucle d'evts
   int rc = DoFit();
   if(rc>=0) FitFunRes();
+  zs.NOp();
 } else if(kw == "fitlin") {
+  ZSync zs(getMutex());
+  SetFgEvtLoopFlag(false);  // l'origine n'est pas la boucle d'evts
   LinFit();
 } else if ((kw == "fitw") && (mApp != NULL) ) {
@@ -1450,11 +1481,9 @@
 void PIAFitterWind::Process(PIMessage msg, PIMsgHandler* sender, void* data)
 {
-int lp = (mFitter->mOpt.lp>2)?1:0;
-int npar = mFitter->mNPar;
 
 // Decodage des messages, init et dismiss
 msg = UserMsg(msg);
 if(msg ==777) {
-  if(lp) cout<<"Dismiss"<<endl;
+  //  cout<<"Dismiss"<<endl;
   //mDap->SetReady();
   Hide();
@@ -1462,8 +1491,14 @@
 }
 
+mFitter->SetFgEvtLoopFlag(true); // On indique que l'origine est la boucle d'evts
+ZSync zs(mFitter->getMutex());   // On s'assure d'une seule execution du code PIAFitting
+
+int lp = (mFitter->mOpt.lp>2)?1:0;
+int npar = mFitter->mNPar;
 // L'objet existe t-il encore?
 if(mDap->ObjMgr()->GetObj(mFitter->mNObj) == NULL) {
   cout<<"PIAFitterWind::Process Error , Pas d'objet de nom "
       <<mFitter->mNObj<<endl;
+  mFitter->SetFgEvtLoopFlag(false);  
   return;
 }
@@ -1634,4 +1669,6 @@
 if(mFitter->mOpt.lp>1) mFitter->PrintOptions();
 
-return;
-}
+zs.NOp();
+mFitter->SetFgEvtLoopFlag(false);
+return;
+}
Index: /trunk/SophyaPI/PIext/piafitting.h
===================================================================
--- /trunk/SophyaPI/PIext/piafitting.h	(revision 2814)
+++ /trunk/SophyaPI/PIext/piafitting.h	(revision 2815)
@@ -16,4 +16,5 @@
 #include "dlftypes.h"
 #include "piacmd.h"
+#include "zthread.h"
 
 class PIStdImgApp;
@@ -42,7 +43,13 @@
                                   ,int nvar,int npar);
 
+  inline void  SetFgEvtLoopFlag(bool fg=false) { fg_evtloop = fg; }
+  inline ZMutex &   getMutex() { return singlefit_mutex; }
+
 friend class PIAFitterWind;
 
 protected :
+bool fg_evtloop;   // true : appel depuis Boucle d'evts, PIAFitterWind
+// Attributs pour controle de thread
+ZMutex singlefit_mutex;  // Pour empecher l'execution simultanee de deux fits
 
 typedef struct DFOptions {
