예제 #1
0
void CalculationThread::run() {
    mdouble wavelength = Processor::LIGHTSPEED / _params.frequency;
    std::cout<<"Start angle: "<<_params.viewpointStartAngle<<", end angle: "<<_params.viewpointEndAngle<<std::endl;
    int iteration = 0;

    for (mdouble viewpointAzimuth = _params.viewpointStartAngle;
            viewpointAzimuth <= _params.viewpointEndAngle;
            viewpointAzimuth += _params.viewpointRotationStep) {
        if (_cancelled)
            return;
        mdouble x, y, z;
        y = _params.viewpointHeight;
        z = _params.viewpointDistance * cos(viewpointAzimuth);
        x = _params.viewpointDistance * sin(viewpointAzimuth);
        
        MVector viewpoint;
        viewpoint<<x, y, z;

        std::complex<mdouble> e = Processor::getE(viewpoint,
                                                      _model,
                                                      wavelength,
                                                      _params.amplitude);

        Processor::CALCULATION_RESULT localResult;
        localResult.azimuth = viewpointAzimuth;
        localResult.E = std::abs(e);
        localResult.eComplex = e;

        _results.push_back(localResult);
        iteration++;
        emit iterationFinished(iteration);
    }
}
예제 #2
0
void SyncController::run(bool saveLog, QFile* log)
{
    this->saveLog = saveLog;
    this->log = log;

    input.open(stdin, QIODevice::ReadOnly);
    output.open(stdout, QIODevice::WriteOnly);

    quint32 cnt;

    QByteArray ba = input.read(4);
    QDataStream modify(&ba, QIODevice::ReadOnly);
    modify>>cnt;
    if(saveLog)
    {
        log->write("\nBytes for read: "+QByteArray::number(cnt));
        log->flush();
    }

    ba.clear();
    forever
    {
        if(saveLog)
        {
            log->write("\nTry to read : "+QByteArray::number(cnt-ba.length())+" bytes");
            log->flush();
        }

        ba.append(input.read(cnt-ba.length()));

        if ((quint32)ba.length() >= cnt)
        {
            if(saveLog)
            {
                log->write("\nEnd readind - bytes limit reached");
                log->flush();
            }
            break;
        }

        if(saveLog)
        {
            log->write("\nBytes readed (part of packet): "+QByteArray::number(ba.length())+" needed: "+QByteArray::number(cnt));
            log->flush();
        }

        if (!input.waitForReadyRead(30000))
        {
            if(saveLog)
            {
                log->write("\nEnd readind - wait limit reached");
                if(!input.atEnd())
                    log->write(" and not at end");
                log->flush();
            }
            if(input.atEnd())
                break;
        }
        //cnt -= ba.length();
        /*
        if(saveLog)
        {
            log->write("\nLets dec waited to : "+QByteArray::number(cnt));
            log->flush();
        }
        */

    }

    if(saveLog)
    {
        log->write("\nBytes readed: "+QByteArray::number(ba.length()));
        log->flush();
    }


    QByteArray message;
    QDataStream in(&ba, QIODevice::ReadOnly);
    in.setVersion(QDataStream::Qt_5_4);

    in >> message;

    message = qUncompress(message);

    QByteArray command = message.left(message.indexOf('\n'));
    message = message.mid(command.length()+1);

    if(saveLog)
    {
        log->write("\nCommand:\n"+command);
        log->write("\nInput:\n"+message);
        log->flush();
    }

    QByteArray answer;
    if (command.startsWith("Execute xml"))
    {
        sc.setXmlFile(message);

        QRegularExpression reg("send istate every (?<interations>\\d+) iterations");
        QRegularExpressionMatch match = reg.match(command);

        if(match.hasMatch())
        {
            iterationsToSend = match.captured("interations").toInt();
            iterationsCount = 1;
            connect(&sc, SIGNAL(iterationFinished(SyncState)), this, SLOT(iterationFinished(SyncState)));
        }

        sc.run();

        if(sc.getState()==SyncCore::syncFail)
        {
            answer = "Error\n"+sc.errorString().toUtf8();
        }
        else
        {
            QRegularExpression reg("return connection \"(?<connection>.+)\"");
            QRegularExpressionMatch match = reg.match(command);
            if(match.hasMatch())
            {
                answer = "Result xml\n"+sc.dump(match.captured("connection"));
            }
            else
            {
                QRegularExpression reg("return states");
                QRegularExpressionMatch match = reg.match(command);
                if(match.hasMatch())
                {
                    QMap<int, SyncState> syncs = sc.getSyncsCompleted();
                    if(syncs.contains(2))
                    {
                        SyncState ss = syncs.value(2);

                        answer = "Result states "+ss.name.toUtf8()
                                +" checked:"+QByteArray::number(ss.num)
                                +" inserts:"+QByteArray::number(ss.numIns)
                                +" insfail:"+QByteArray::number(ss.numInsFail)
                                +" deletes:"+QByteArray::number(ss.numDel)
                                +" delfail:"+QByteArray::number(ss.numDelFail)
                                +" updates:"+QByteArray::number(ss.numUpd)
                                +" updfail:"+QByteArray::number(ss.numUpdFail);
                    }
                }
            }
        }
    }

    if(saveLog)
    {
        log->write("\nOutput:\n"+answer);
        log->write("\nMessage:\n"+formatMessage(answer).toHex());
    }

    output.write(formatMessage(answer));
    output.flush();
    output.close();

    input.close();
}