class LogReader
class LogReader: public QObject
{
Q_OBJECT
protected:
std::vector<Uint> m_vBlock; ///< вектор прочитанных слов
FILE* file; ///< файл загрузки (лог-файл)
public:
std::vector<ParamDescr*> rec_descr; ///< вектор параметров из файла описания (файла загрузки)
RThread* rthread; ///< указатель объект класса потока
int count_files; ///< количество непрочитанных файлов
protected:
LOGRECORD ParseBlock();
void ChangeDateTime(LOGRECORD& t, std::string compared_time, std::string compared_date);
//.............
std::vector<LOGRECORD> TRead();
};
/// Чтение файла загрузки
vector<LOGRECORD> LogReader::TRead()
{
Uint var = (Uint)1E+6;
bool bBlock = false;
bool file_read = false;
vector<LOGRECORD> log;
time_t before_read;
time(&before_read);
while(fread(&var, sizeof(var), 1, file) > 0 && !feof(file))
{
Suint adr = var % 256;
/// Определение начала/конца одной записи и записывание ее в вектор
switch(adr)
{
case 0000:
m_vBlock.clear();
bBlock = true;
break;
case 0001:
if(bBlock)
{
LOGRECORD t = ParseBlock();
ChangeDateTime(t, "cur_time", "cur_date");
log.push_back(t);
file_read = true;
/// Сравнение временных меток
time_t contin_read;
time(&contin_read);
time_t delta = contin_read - before_read;
if(delta > 5)
{
rthread -> stop();
//rthread -> wait(1000);
}
}
bBlock = false;
break;
default:
if(bBlock)
m_vBlock.push_back(var);
}
}
/// Закрываем файл с логом
ShutDown();
/// Уменьшаем список непрочитанных файлов
if(file_read)
{
--count_files;
rthread -> stop();
}
return log;
}
class RThread: public QThread
{
Q_OBJECT
private:
enum { MAXRECENTFILES = 7 };
volatile bool stopped; ///< переменная, контролирующая начало и конец выполнения потока
QMutex mutex; ///< мьютекс для блокировки данных при работе с ними дополнительного потока
public:
Reader::LogReader* logger; ///< объект для чтения логов
std::vector<LOGRECORD> read_log;///< вектор LOGRECORD , в котором находятся значения из считанного файла
protected:
void run();
public:
RThread(): stopped(false) {}
void stop();
};
/// Запуск дополницельного потока
void RThread::run()
{
forever
{
mutex.lock();
if(stopped)
{
stopped = false;
mutex.unlock();
break;
}
read_log = logger -> TRead();
mutex.unlock();
}
//QThread::run();
}
/// Остановка дополнительных потоков
void RThread::stop()
{
mutex.lock();
stopped = true;
mutex.unlock();
}
Могу пояснить вопрос. Как вот в этом месте
if(delta > 5)
{
rthread -> stop();
//rthread -> wait(1000);
}
Перейти в функцию run()?