Зарегистрироваться или не зарегистрироваться, весь проект Eclipse?

Слишком много раз я нашел способы решить то, о чем вы просите, на мой взгляд, слишком сложно. Например, вы должны определить новые типы классов, библиотеку ссылок и т. Д. Поэтому я решил написать несколько строк кода, которые позволяют конечному пользователю в принципе «thread -ize» «void :: method (void)» из любой класс. Конечно, это решение, которое я реализовал, может быть расширенным, улучшенным и т. Д., Поэтому, если вам нужны более конкретные методы или функции, добавьте их и, пожалуйста, будьте любезны, чтобы держать меня в цикле.

Вот 3 файла, которые показать, что я сделал.

    // A basic mutex class, I called this file Mutex.h
#ifndef MUTEXCONDITION_H_
#define MUTEXCONDITION_H_

#include <pthread.h>
#include <stdio.h>

class MutexCondition
{
private:
    bool init() {
        //printf("MutexCondition::init called\n");
        pthread_mutex_init(&m_mut, NULL);
        pthread_cond_init(&m_con, NULL);
        return true;
    }

    bool destroy() {
        pthread_mutex_destroy(&m_mut);
        pthread_cond_destroy(&m_con);
        return true;
    }

public:
    pthread_mutex_t m_mut;
    pthread_cond_t m_con;

    MutexCondition() {
        init();
    }
    virtual ~MutexCondition() {
        destroy();
    }

    bool lock() {
        pthread_mutex_lock(&m_mut);
        return true;
    }

    bool unlock() {
        pthread_mutex_unlock(&m_mut);
        return true;
    }

    bool wait() {
        lock();
        pthread_cond_wait(&m_con, &m_mut);
        unlock();
        return true;
    }

    bool signal() {
        pthread_cond_signal(&m_con);
        return true;
    }
};
#endif
// End of Mutex.h

// Класс, который инкапсулирует всю работу по потоковому методу (test.h):

#ifndef __THREAD_HANDLER___
#define __THREAD_HANDLER___

#include <pthread.h>
#include <vector>
#include <iostream>
#include "Mutex.h"

using namespace std;

template <class T> 
class CThreadInfo
{
  public:
    typedef void (T::*MHT_PTR) (void);
    vector<MHT_PTR> _threaded_methods;
    vector<bool> _status_flags;
    T *_data;
    MutexCondition _mutex;
    int _idx;
    bool _status;

    CThreadInfo(T* p1):_data(p1), _idx(0) {}
    void setThreadedMethods(vector<MHT_PTR> & pThreadedMethods)
    {
        _threaded_methods = pThreadedMethods;
      _status_flags.resize(_threaded_methods.size(), false);
    }
};

template <class T> 
class CSThread {
  protected:
    typedef void (T::*MHT_PTR) (void);
    vector<MHT_PTR> _threaded_methods;
    vector<string> _thread_labels;
    MHT_PTR _stop_f_pt;
    vector<T*> _elements;
    vector<T*> _performDelete;
    vector<CThreadInfo<T>*> _threadlds;
    vector<pthread_t*> _threads;
    int _totalRunningThreads;

    static void * gencker_(void * pArg)
    {
      CThreadInfo<T>* vArg = (CThreadInfo<T> *) pArg;
      vArg->_mutex.lock();
      int vIndex = vArg->_idx++;
      vArg->_mutex.unlock();

      vArg->_status_flags[vIndex]=true;

      MHT_PTR mhtCalledOne = vArg->_threaded_methods[vIndex];
      (vArg->_data->*mhtCalledOne)();
      vArg->_status_flags[vIndex]=false;
        return NULL;
    }

  public:
    CSThread ():_stop_f_pt(NULL), _totalRunningThreads(0)  {}
    ~CSThread()
    {
      for (int i=_threads.size() -1; i >= 0; --i)
          pthread_detach(*_threads[i]);

      for (int i=_threadlds.size() -1; i >= 0; --i)
        delete _threadlds[i];

      for (int i=_elements.size() -1; i >= 0; --i)
         if (find (_performDelete.begin(), _performDelete.end(), _elements[i]) != _performDelete.end())
              delete _elements[i];
    }
    int  runningThreadsCount(void) {return _totalRunningThreads;}
    int  elementsCount()        {return _elements.size();}
    void addThread (MHT_PTR p, string pLabel="") { _threaded_methods.push_back(p); _thread_labels.push_back(pLabel);}
    void clearThreadedMethods() { _threaded_methods.clear(); }
    void getThreadedMethodsCount() { return _threaded_methods.size(); }
    void addStopMethod(MHT_PTR p)  { _stop_f_pt  = p; }
    string getStatusStr(unsigned int _elementIndex, unsigned int pMethodIndex)
    {
      char ch[99];

      if (getStatus(_elementIndex, pMethodIndex) == true)
        sprintf (ch, "[%s] - TRUE\n", _thread_labels[pMethodIndex].c_str());
      else 
        sprintf (ch, "[%s] - FALSE\n", _thread_labels[pMethodIndex].c_str());

      return ch;
    }
    bool getStatus(unsigned int _elementIndex, unsigned int pMethodIndex)
    {
      if (_elementIndex > _elements.size()) return false;
      return _threadlds[_elementIndex]->_status_flags[pMethodIndex];
    }

    bool run(unsigned int pIdx) 
    {
      T * myElem = _elements[pIdx];
      _threadlds.push_back(new CThreadInfo<T>(myElem));
      _threadlds[_threadlds.size()-1]->setThreadedMethods(_threaded_methods);

      int vStart = _threads.size();
      for (int hhh=0; hhh<_threaded_methods.size(); ++hhh)
          _threads.push_back(new pthread_t);

      for (int currentCount =0; currentCount < _threaded_methods.size(); ++vStart, ++currentCount)
      {
                if (pthread_create(_threads[vStart], NULL, gencker_, (void*) _threadlds[_threadlds.size()-1]) != 0)
        {
                // cout <<"\t\tThread " << currentCount << " creation FAILED for element: " << pIdx << endl;
                    return false;
                }
        else
        {
            ++_totalRunningThreads;
             // cout <<"\t\tThread " << currentCount << " creation SUCCEDED for element: " << pIdx << endl;
                }
      }
      return true;
    }

    bool run() 
    {
            for (int vI = 0; vI < _elements.size(); ++vI) 
            if (run(vI) == false) return false;
          // cout <<"Number of currently running threads: " << _totalRunningThreads << endl;
        return true;
    }

    T * addElement(void)
    {
      int vId=-1;
      return addElement(vId);
    }

    T * addElement(int & pIdx)
    {
      T * myElem = new T();
      _elements.push_back(myElem);
      pIdx = _elements.size()-1;
      _performDelete.push_back(myElem);
      return _elements[pIdx];
    }

    T * addElement(T *pElem)
    {
      int vId=-1;
      return addElement(pElem, vId);
    }

    T * addElement(T *pElem, int & pIdx)
    {
      _elements.push_back(pElem);
      pIdx = _elements.size()-1;
      return pElem;
    }

    T * getElement(int pId) { return _elements[pId]; }

    void stopThread(int i)  
    {
      if (_stop_f_pt != NULL) 
      {
         ( _elements[i]->*_stop_f_pt)() ;
      }
      pthread_detach(*_threads[i]);
      --_totalRunningThreads;
    }

    void stopAll()  
    {
      if (_stop_f_pt != NULL) 
        for (int i=0; i<_elements.size(); ++i) 
        {
          ( _elements[i]->*_stop_f_pt)() ;
        }
      _totalRunningThreads=0;
    }
};
#endif
// end of test.h

// Использование пример файла «test.cc», который на linux я скомпилировал с классом, который инкапсулирует всю работу для потоковой реализации метода: g ++ -o mytest.exe test.cc -I. -lpthread -lstdc ++

#include <test.h>
#include <vector>
#include <iostream>
#include <Mutex.h>

using namespace std;

// Just a class for which I need to "thread-ize" a some methods
// Given that with OOP the objecs include both "functions" (methods)
// and data (attributes), then there is no need to use function arguments,
// just a "void xxx (void)" method.
// 
class TPuck
{
  public:
   bool _go;
   TPuck(int pVal):_go(true)
   {
     Value = pVal;
   }
   TPuck():_go(true)
   {
   }
   int Value;
   int vc;

   void setValue(int p){Value = p; }

   void super()
   {
     while (_go)
     {
      cout <<"super " << vc << endl;
            sleep(2);
         }
      cout <<"end of super " << vc << endl;
   }

   void vusss()
   {
     while (_go)
     {
      cout <<"vusss " << vc << endl;
      sleep(2);
     }
      cout <<"end of vusss " << vc << endl;
   }

   void fazz()
   {
     static int vcount =0;
     vc = vcount++;
     cout <<"Puck create instance: " << vc << endl;
     while (_go)
     {
       cout <<"fazz " << vc << endl;
       sleep(2);
     }
     cout <<"Completed TPuck..fazz instance "<<  vc << endl;
   }

   void stop()
   {
      _go=false;
      cout << endl << "Stopping TPuck...." << vc << endl;
   }
};


int main(int argc, char* argv[])
{
  // just a number of instances of the class I need to make threads
  int vN = 3;

  // This object will be your threads maker.
  // Just declare an instance for each class
  // you need to create method threads
  //
  CSThread<TPuck> PuckThreadMaker;
  //
  // Hera I'm telling which methods should be threaded
  PuckThreadMaker.addThread(&TPuck::fazz, "fazz1");
  PuckThreadMaker.addThread(&TPuck::fazz, "fazz2");
  PuckThreadMaker.addThread(&TPuck::fazz, "fazz3");
  PuckThreadMaker.addThread(&TPuck::vusss, "vusss");
  PuckThreadMaker.addThread(&TPuck::super, "super");

  PuckThreadMaker.addStopMethod(&TPuck::stop);

  for (int ii=0; ii<vN; ++ii)
  {
    // Creating instances of the class that I need to run threads.
    // If you already have your instances, then just pass them as a
    // parameter such "mythreadmaker.addElement(&myinstance);"
    TPuck * vOne = PuckThreadMaker.addElement();
  }

  if (PuckThreadMaker.run() == true)
  {
    cout <<"All running!" << endl;
  }
  else
  {
    cout <<"Error: not all threads running!" << endl;
  }

  sleep(1);
  cout <<"Totale threads creati: " << PuckThreadMaker.runningThreadsCount()  << endl;
  for (unsigned int ii=0; ii<vN; ++ii)
  {
    unsigned int kk=0;
    cout <<"status for element " << ii << " is " << PuckThreadMaker.getStatusStr(ii, kk++) << endl; 
    cout <<"status for element " << ii << " is " << PuckThreadMaker.getStatusStr(ii, kk++) << endl; 
    cout <<"status for element " << ii << " is " << PuckThreadMaker.getStatusStr(ii, kk++) << endl; 
    cout <<"status for element " << ii << " is " << PuckThreadMaker.getStatusStr(ii, kk++) << endl; 
    cout <<"status for element " << ii << " is " << PuckThreadMaker.getStatusStr(ii, kk++) << endl; 
  }

  sleep(2);
  PuckThreadMaker.stopAll();
  cout <<"\n\nAfter the stop!!!!" << endl;
  sleep(2);

  for (int ii=0; ii<vN; ++ii)
  {
    int kk=0;
    cout <<"status for element " << ii << " is " << PuckThreadMaker.getStatusStr(ii, kk++) << endl; 
    cout <<"status for element " << ii << " is " << PuckThreadMaker.getStatusStr(ii, kk++) << endl; 
    cout <<"status for element " << ii << " is " << PuckThreadMaker.getStatusStr(ii, kk++) << endl; 
    cout <<"status for element " << ii << " is " << PuckThreadMaker.getStatusStr(ii, kk++) << endl; 
    cout <<"status for element " << ii << " is " << PuckThreadMaker.getStatusStr(ii, kk++) << endl; 
  }

  sleep(5);
  return 0;
}

// End of test.cc
39
задан 2 revsuser14070 15 January 2009 в 21:51
поделиться

12 ответов

Как минимум необходимо быть регистрацией .project и .classpath файлы. Если кто-либо в Вашей команде - жесткое кодирование внешнее местоположение JAR в .classpath, необходимо поднять их против стены и стрелять в них. Я использую Знатока для управления моими зависимостями, но если Вы не используете знатока, необходимо создать пользовательские библиотеки для внешних БАНОК с с последовательным соглашением о присвоении имен.

После этого необходимо рассмотреть вещи на плагине сменным основанием. Например, я работаю с Spring так я всегда регистрация .springBeans и аналогично для CheckStyle I всегда регистрация .checkstyle проект.

Это становится немного более хитрым когда дело доходит до конфигурации в .settings папка, но я обычно регистрация следующее, если я изменяю настройки по умолчанию для своего проекта и хочу их совместно использованный с остальной частью команды:

  • .settings/org.eclipse.jdt.ui.prefs - это содержит настройки для импорта, заказывая
  • .settings/org.eclipse.jdt.core.prefs - это содержит настройки для версии

компилятора В целом, я не заметил Ganymede, изменяющего файлы без меня изменяющий предпочтения проекта.

20
ответ дан Brian Matthews 23 September 2019 в 18:12
поделиться

Я рекомендую использовать знаток так, чтобы весь жизненный цикл был за пределами любого IDE. Можно легко создать проект затмения с ним на командной строке, и можно использовать то, что Вы хотите, если это не затмение. Это имеет, это - причуды, но вынимает большую горечь когда дело доходит до зависимостей и управления сборками.

9
ответ дан André 23 September 2019 в 18:12
поделиться

Я использую IntelliJ, который имеет файлы проекта XML. Я не регистрирую тех, потому что они часто изменяются и легки воссоздать, если я должен.

я не регистрируюсь в файлах JAR. Я сохраняю тех в отдельном репозитории, а-ля Знаток 2.

я не регистрируюсь в ВОЙНАХ или БАНКАХ или javadocs или чем-либо еще, что может быть сгенерировано.

я действительно регистрируюсь в SQL и сценариях и источнике Java и конфигурации XML.

1
ответ дан duffymo 23 September 2019 в 18:12
поделиться

Попытайтесь портировать свой проект на систему сборки как знаток. Это имеет все, что необходимо получить тот же опыт проекта на каждой машине, которую Вы используете.

существуют плагины для просто всего. Как плагин затмения. Вы просто вводите "mvn eclipse:eclipse", и плагин генерирует Ваше все готовое для работы проекта затмения.

Для предоставления ответа на вопрос. Никогда не регистрируйтесь в файлах, которые не используются Вашим проектом никогда в цикле разработки. Это означает, что в файлах метаданных как свойства затмения и т.д. никогда нельзя регистрироваться в SCM.

4
ответ дан BenGeee 23 September 2019 в 18:12
поделиться

Я только когда-либо регистрируюсь в вещах, сделаны людьми, что-либо еще, что сгенерировано (или автоматически или не) должно быть легко повторно создать снова и склонен измениться (как Вы заявили). Единственное исключение к этому - когда сгенерированные файлы тверды (требует большого человеческого вмешательства;)) для разбираний в нем. Как когда-либо вещи как это должны действительно быть автоматизированы некоторые как.

6
ответ дан hhafez 23 September 2019 в 18:12
поделиться

Мне нравится регистрироваться в .project, .classpath, и подобных файлах , только если они будут идентичны на машине любого пользователя Eclipse так или иначе. (Люди, использующие другие IDE, должны быть в состоянии проверить и разработать Ваш проект независимо, но та проблема является ортогональной к тому, зарегистрироваться ли в файлах только для Eclipse.)

, Если различные пользователи, работающие над проектом, захотят внести изменения или тонкие настройки к их .project или .classpath или другим файлам, я рекомендую не сделать , проверяют их в управлении исходным кодом. Это только вызовет головные боли в конечном счете.

3
ответ дан Ross 23 September 2019 в 18:12
поделиться

Я предложил бы иметь фактические файлы проекта, проигнорированные системой управления версиями из-за оборотных сторон, которые Вы упомянули.

, Если бы существует достаточно последовательной информации в настройках проекта, что было бы преимущество от наличия ее доступно, скопировало бы ее в местоположение, которое Eclipse не рассматривает как особенный, и Вы будете иметь его в наличии для работы с на контроле (и скопировать назад туда, где Eclipse обратит внимание на нее). Существует достойный шанс, что разделение фактических файлов проекта от управляемых приведет к потере синхронизации, таким образом, я только предложил бы это, если существует ясное преимущество от имения в наличии настроек (или Вы уверены, что будете в состоянии сохранить их, синхронизировался)

1
ответ дан Cebjyre 23 September 2019 в 18:12
поделиться

В нашем случае мы раньше регистрировались в файлах проекта (.project и .classpath), чтобы облегчить для всех разработчиков создавать их рабочую область проекта. Общий предпочтительный файл и набор проекта команды были расположены в управлении исходным кодом также, так создание Вашей рабочей области было так же просто как предпочтения импорта и набор проекта команды импорта. Это работало очень хорошо, но действительно полагается на всех имеющие последовательную среду, любые настройки должны были бы быть применены после того, как основная рабочая область создается.

Мы все еще делаем это по большей части, но Знаток теперь используется поэтому, конечно, управление зависимостью обрабатывается через Знатока вместо этого. Для предотвращения конфликтующей информации .project и .classpath были удалены из управления исходным кодом и теперь сгенерированы через цели знатока, прежде чем мы импортируем набор проекта команды. Это легко допускало бы различные среды, поскольку Вам просто будут нужны сценарии для генерации IDE определенные части на основе конфигурации Знатока.

пз - Для простоты обслуживания, хотя, я предпочитаю иметь всех, используют ту же среду. Что-либо еще неизбежно становится полностью занятым заданием обслуживания для кого-то.

1
ответ дан Robin 23 September 2019 в 18:12
поделиться

В нашем мире мы регистрируемся во всем проекте Eclipse и всей параллели, но разделяем проект Netbeans. Наши мотивации для этого были полностью сфокусированы на, "когда я делаю контроль, я хочу функциональную конфигурацию сразу позже". Это означает, что мы должны были сделать некоторую работу:

  1. Создают выполнимые конфигурации для каждого основного IDE (люди как то, что они любят). Это включает основной класс, рабочий каталог, параметры VM, и т.д.
  2. Создают полезные сценарии запуска для всех наших соответствующих сценариев.
  3. Создают отредактированные наборы данных, которые не заставляют контроль брать слишком много дольше (это - большой проект).

Эта философия стоила наличных денег (или по крайней мере трудовые часы, которые являются [почти 110] более ценные), когда наш новый наем смог проверить проект от Подрывной деятельности в Eclipse и сразу выполнить функциональную систему с (небольшим) реальным набором данных без любой суеты или беспокойства с его стороны.

Продолжают : эта философия "делает жизнь нового парня легче" заплативший снова, когда он изменил IDE (он решил попробовать Netbeans после использования Eclipse в течение довольно долгого времени и решил придерживаться его некоторое время). Никакая конфигурация не требовалась вообще, он просто открыл проект Netbeans в том же каталоге, на который указывал Eclipse. Прошедшее время переключения: приблизительно 60 секунд.

7
ответ дан Bob Cross 23 September 2019 в 18:12
поделиться

Не делать. Только зарегистрируйтесь в исходном коде своих проектов.

0
ответ дан Eldelshell 23 September 2019 в 18:12
поделиться

Как ответ на:

"Существуют настройки, уникальные для каждой машины разработки, а также настроек, глобальных для всех разработчиков на проекте. Держание отдельно их было трудно".

Eclipse предлагает много способов сохранить локальные настройки управляемыми: Переменные Пути к классу Java (Java> Путь Сборки> Переменные Пути к классу) один, 'Связанные Ресурсы' (Общий> Рабочая область> Связанные Ресурсы) являются другим http://help.eclipse.org/stable/index.jsp?topic=/org.eclipse.platform.doc.user/concepts/concepts-13.htm Создание README, который указывает, какие настройки установить прежде, чем создать/выполнить проект работает вполне прилично, по-моему.

Теперь, как удостовериться, Ваша непрерывная система сборки понимает изменения, которые были внесены в настройки затмения, это - другая проблема... (У меня есть отдельный build.xml для муравья, которого я держу в курсе вручную)

0
ответ дан Simon Groenewolt 23 September 2019 в 18:12
поделиться

Netbeans 6.5 имеет улучшенный импорт проекта Eclipse, который, как предполагается, синхронизирует изменения от Netbeans назад к Eclipse: http://wiki.netbeans.org/NewAndNoteWorthyNB65#section-NewAndNoteWorthyNB65-EclipseProjectImportAndSynchronization

1
ответ дан Karsten Silz 23 September 2019 в 18:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: