diff --git a/app/controller.cpp b/app/controller.cpp
index 5ab495522017a66855bce223d30bb5ddee14fedd..db6a33327f15b56f6383612ec4aa493b87e4151f 100644
--- a/app/controller.cpp
+++ b/app/controller.cpp
@@ -1,10 +1,17 @@
 #include "controller.h"
 #include <QDebug>
+#include <QElapsedTimer>
 
 Controller::Controller(MainWindow *window) : eltCollection(), genStatus(), main(window)
 {
     eltCollection.insertColumns(0,8);
+    //QThread* thread = QThread::create([this]{ eltCollection.update();});
+    //thread->start();
+    //QElapsedTimer t;
+    //t.start();
     main->set_task(&eltCollection);
+    //qDebug() << "setModel : " << t.elapsed() << "milliseconds";
+
     QTimer *timer = new QTimer();
     timer->connect(timer, SIGNAL(timeout()), this , SLOT(update()));
     timer->start(5000);
@@ -13,8 +20,18 @@ Controller::Controller(MainWindow *window) : eltCollection(), genStatus(), main(
 
 void Controller::update(){
     //qDebug() << "timer lancé";
+
+    ElementsTableModel elm;
+    main->set_task(&elm);
+
+    //QElapsedTimer timer;
     eltCollection.update();
-    main->update_tasks();
+
+
+    //timer.start();
+    main->set_task(&eltCollection);
+    //qDebug() << "setModel : " << timer.elapsed() << "milliseconds";
+
     genStatus.update();
     main->update_status(genStatus);
     //eltCollection.update();
diff --git a/app/controller.h b/app/controller.h
index 4c704c7870ac14cc969fbd4894acd540b4cd17c1..4ce2c7e904f0772d90aab94dc931664cce5053f6 100644
--- a/app/controller.h
+++ b/app/controller.h
@@ -7,6 +7,7 @@
 #include "mainwindow.h"
 #include <QTimer>
 #include <QApplication>
+#include <QThread>
 
 
 class Controller : public QObject
diff --git a/app/elementstablemodel.cpp b/app/elementstablemodel.cpp
index b3519fcdff3533cc61096a3de7c267b4bf98d53c..89e4c68689df5a9b729d4bb130d06557d6ee1b62 100644
--- a/app/elementstablemodel.cpp
+++ b/app/elementstablemodel.cpp
@@ -1,4 +1,5 @@
 #include "elementstablemodel.h"
+#include <QElapsedTimer>
 
 ElementsTableModel::ElementsTableModel(QObject *parent)
     : QAbstractTableModel(parent), task_list(".listT")
@@ -101,7 +102,7 @@ void ElementsTableModel::insertTask(Task &task, int key){
     beginInsertRows(QModelIndex(), rowCount(), rowCount());
     taskMap.insert(key, task);
     pidVector.append(key);
-    //qDebug() << "insert " << key << ";" + task.print();
+    //qDebug() << "insert " << key << ";" + task.print(" ");
     endInsertRows();
 }
 
@@ -145,43 +146,74 @@ bool ElementsTableModel::removeColumns(int column, int count, const QModelIndex
 }
 
 
+
+
 void ElementsTableModel::update()
 {
+    //QElapsedTimer timer;
+    //timer.start();
     system("ls /proc | grep '[0-9]' > .listT");
+    //qDebug() << "write tasks list :" << timer.elapsed() << "milliseconds";
+
     if(!task_list.open(QIODevice::ReadOnly)) {
         QMessageBox::information(0, "error", task_list.errorString());
     }
     QTextStream in(&task_list);
 
-    foreach (Task task, taskMap) {
-        task.setExist(false);
-    }
+    //timer.start();
+
+    QMap<int, Task>::iterator it;
+    for (it = taskMap.begin(); it != taskMap.end(); ++it) it.value().setExist(false);
+
+
+    //qDebug() << "fold map :" << timer.elapsed() << "milliseconds";
+
 
     int pid;
     while(!in.atEnd()) {
         pid = in.readLine().toInt();
+        //Task* test = find(pid);
 
+        QMap<int, Task>::iterator it = taskMap.find(pid);
+        //Task& test = it.value();
 
-        //int index = taskVector.indexOf(pid);
-        Task test = taskMap.value(pid,Task(0));
-        if (test.getPID() == 0)
+        //qDebug() << "search in map :" << timer.elapsed() << "milliseconds";
+        //qDebug() << test.print("|");
+
+        if (it == taskMap.end())
         {
+
+            //timer.start();
             Task t(pid);
-            if (t.isExist()) insertTask(t, pid);
+
+            //qDebug() << "1 task created :" << timer.elapsed() << "milliseconds";
+
+            if (t.isExist())
+            {
+                //timer.start();
+                insertTask(t, pid);
+                //qDebug() << "1 task inserted :" << timer.elapsed() << "milliseconds";
+            }
+
         }
         else
         {
-            //Task t = taskVector[index];
-            test.update();
-            if (!test.isExist()) removeTask(pid);
+            it->update();
 
-        }
 
-        //model->appendRow(line);
+            if (!it->isExist())
+            {
+                //timer.start();
+                removeTask(pid);
+                //qDebug() << "1 task removed :" << timer.elapsed() << "milliseconds";
+            }
+        }
     }
 
-
     task_list.close();
+
+    usleep(10000);
+
 }
 
 
@@ -206,4 +238,3 @@ void ElementsTableModel::writeCSV(QFile file)
 
 
 
-
diff --git a/app/elementstablemodel.h b/app/elementstablemodel.h
index bce3c13c2cb5238bee95674ea71b842e8f469e10..363829720e73ec694c0e234db87f2cbc1e97f316 100644
--- a/app/elementstablemodel.h
+++ b/app/elementstablemodel.h
@@ -1,10 +1,17 @@
 #ifndef ELEMENTSTABLEMODEL_H
 #define ELEMENTSTABLEMODEL_H
 
+#include <unistd.h>
+
 #include <QAbstractTableModel>
 #include <task.h>
 #include <QDebug>
 #include <QFile>
+//#include <updatethread.h>
+
+#include <QThread>
+#include <QTimer>
+#include <QMutex>
 
 
 class ElementsTableModel : public QAbstractTableModel
@@ -45,6 +52,8 @@ private:
     QVector<int> pidVector;
     QFile task_list;
 
+    QMutex mutex;
+
 };
 
 #endif // ELEMENTSTABLEMODEL_H
diff --git a/app/task.cpp b/app/task.cpp
index d0bfeb6973783c2359de75cb2a1d5e0f058c12b8..23637cd924e72742e1d8af18d01894f963ecf3a4 100644
--- a/app/task.cpp
+++ b/app/task.cpp
@@ -1,5 +1,6 @@
 #include "task.h"
 #include <qdebug.h>
+#include <QElapsedTimer>
 
 Task::Task() : PID(0){
 
@@ -9,6 +10,7 @@ Task::Task(int PID) : PID(PID), utime(0), stat("/proc/"+QString::number(PID)+"/s
 {
     if (PID==0)
     {
+        exist = false;
         return;
     }
     QFile cmd("/proc/"+QString::number(PID)+"/comm");
@@ -92,6 +94,8 @@ bool operator ==(int pid, const Task & task)
 
 void Task::update()
 {
+    //QElapsedTimer timer;
+    //timer.start();
     if(!stat.open(QIODevice::ReadOnly)) {
         exist = false;
         return;
@@ -105,18 +109,20 @@ void Task::update()
     status = fields.at(2);
 
     long memTotal = 800000000000;
-    mem = static_cast<int>((static_cast<double>(memTotal-fields.at(22).toInt())/static_cast<double>(memTotal))*100*100.0)/100.0;
+    mem = static_cast<int>((static_cast<double>(fields.at(22).toInt())/static_cast<double>(memTotal))*100*100.0)/100.0;
 
     //mem = static_cast<int>(((80000000000.0-fields.at(22).toDouble())/80000000000.0)*100*100.0)/100.0;
 
     int new_utime = fields.at(13).toInt();
     CPU = static_cast<double>(new_utime-utime);
+    //qDebug() << new_utime << "-" << utime << "=" << CPU;
     utime = new_utime;
     PPID = fields.at(3).toInt();
 
     stat.close();
     exist = true;
 
+    //qDebug() << "1 task update :" << timer.elapsed() << "milliseconds";
     //qDebug() << print();
 }
 
@@ -162,7 +168,7 @@ QString Task::getUser() const
     return user;
 }
 
-QString Task::print(QString sep=" ") const
+QString Task::print(QString sep) const
 {
 
     int time = utime;
diff --git a/app/task.h b/app/task.h
index 6db14cb60928d6cf47e39154bfd4f7f550f73f00..bda43153ea9fc60b77321840a9dcd221e09b20d4 100644
--- a/app/task.h
+++ b/app/task.h
@@ -28,7 +28,7 @@ public:
     int getPPID() const;
     QString getUser() const;
 
-    QString print(QString) const;
+    QString print(QString sep = " ") const;
 
     Task & operator=(const Task &);
     //bool operator ==(int pid);