#ifndef CUSTOMTHREADS_H #define CUSTOMTHREADS_H #include #include #include "macro.h" #include "ClassDigitizer.h" static QMutex digiMTX[MaxNBoards * MaxNPorts]; //^#===================================================== ReadData Thread class ReadDataThread : public QThread { Q_OBJECT public: ReadDataThread(Digitizer * dig, int digiID, QObject * parent = 0) : QThread(parent){ this->digi = dig; this->ID = digiID; isSaveData = false; isScope = false; readCount = 0; stop = false; } void Stop() { this->stop = true;} void SetSaveData(bool onOff) {this->isSaveData = onOff;} void SetScopeMode(bool onOff) {this->isScope = onOff;} void run(){ clock_gettime(CLOCK_REALTIME, &ta); // clock_gettime(CLOCK_REALTIME, &t1); stop = false; do{ if( stop) break; digiMTX[ID].lock(); int ret = digi->ReadData(); digiMTX[ID].unlock(); readCount ++; if( stop) break; if( ret == CAEN_DGTZ_Success && !stop){ digiMTX[ID].lock(); digi->GetData()->DecodeBuffer(!isScope, 0); if( isSaveData ) digi->GetData()->SaveData(); digiMTX[ID].unlock(); // clock_gettime(CLOCK_REALTIME, &t2); // if( t2.tv_sec - t1.tv_sec > 2 ) { // printf("----Digi-%d read %ld / sec.\n", ID, readCount / 2); // readCount = 0; // t1 = t2; // } }else{ printf("ReadDataThread::%s------------ ret : %d \n", __func__, ret); digiMTX[ID].lock(); digi->StopACQ(); digiMTX[ID].unlock(); break; } if( isSaveData && !stop ) { clock_gettime(CLOCK_REALTIME, &tb); if( tb.tv_sec - ta.tv_sec > 2 ) { digiMTX[ID].lock(); emit sendMsg("FileSize ("+ QString::number(digi->GetSerialNumber()) +"): " + QString::number(digi->GetData()->GetTotalFileSize()/1024./1024., 'f', 4) + " MB"); digiMTX[ID].unlock(); ta = tb; } } }while(!stop); printf("ReadDataThread stopped.\n"); } signals: void sendMsg(const QString &msg); private: Digitizer * digi; bool stop; int ID; timespec ta, tb, t1, t2; bool isSaveData; bool isScope; unsigned long readCount; }; //^#======================================================= Timing Thread class TimingThread : public QThread { Q_OBJECT public: TimingThread(QObject * parent = 0 ) : QThread(parent){ waitTime = 20; // 10 x 100 milisec stop = false; } void Stop() { this->stop = true;} void SetWaitTimeinSec(float sec) {waitTime = sec * 10 ;} float GetWaitTimeinSec() const {return waitTime/10.;} void run(){ unsigned int count = 0; stop = false; do{ usleep(100000); count ++; if( count % waitTime == 0){ emit timeUp(); } }while(!stop); } signals: void timeUp(); private: bool stop; unsigned int waitTime; }; #endif