среда, 19 октября 2011 г.

Qthread подсчет максимальной величины символов (задача Nival)

Полгода назад компания Nival прислало мне желание меня лицезреть и тест который нужно сделать.На что я плюнул на эту затею, не потому что я что то плохое имею к Nival
а просто знаю что в gamedev платят через чур мало :)
Но тест вот лежал, и решил его сделать на Qt

Смысл задания сводиться к тому, что бы загрузить любой документ и найти максимальную
последовательность , то есть 0,1,2,33,55,66,33 тут максимум 6 и так далее по всему файлу.
Ну и последняя фича, нужно все это сделать в потоке.
reliase:

#ifndef CALCULATE_H
#define CALCULATE_H

#include <QThread>
#include <QByteArray>
#include <QFile>
#include <QMutex>

namespace test
{
 class Calculate : public QThread
 {
  Q_OBJECT
 public:
  Calculate(QString _filename , int _iCountThread) : QThread(0) ,m_iCountThread(_iCountThread) {

   QFile file(_filename);
   if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
   {
    qDebug("error not found file");
   }else // file found
   {
    m_currentlyElements = file.readAll();
    qDebug("%d size block %d  filename %s ",m_iCountThread,m_currentlyElements.size(),_filename.toStdString().c_str());

   }
   m_tmpElements.clear();
  }
 protected:
  void run()
  {
   int iCount = 0;
   while(reCalculate(iCount++))
   {}
  }

  virtual ~Calculate() {}
 private:
  int m_iCountThread;
  QByteArray m_maxElements , m_currentlyElements , m_tmpElements;
  QMutex m_mutex;

  bool reCalculate(int m_iCount)
  {
   m_mutex.lock();
   // делаем перебор и заполняем темлайтный массив
    if (m_iCount + 1 < m_currentlyElements.size()) // max size + 1
    {
     if (m_currentlyElements.at(m_iCount) <= m_currentlyElements.at(m_iCount + 1) )
     {
      m_tmpElements += m_currentlyElements.at(m_iCount);
     }else
     {
      if (m_maxElements.size() < m_tmpElements.size())
      {
       m_maxElements = m_tmpElements;
      }
     m_tmpElements.clear();

     }
    }else
    {
     int count = 0;
     while(count != m_maxElements.size())
     {
      qDebug("valuse %d (%d)",m_maxElements.at(count),m_iCountThread);
      count++;
     }
     qDebug("destroy %d thread",m_iCountThread);
     m_mutex.unlock();
     return false;// finish search
    }

   if (m_maxElements.size() < m_tmpElements.size())
    m_maxElements = m_tmpElements;

   m_mutex.unlock();
   return true;// loop more
  }
 };
}
#endif // CALCULATE_H

test::Calculate *val = new test::Calculate("filename");
val->start();

сразу извиняюсь за форматирование он тут суров.