calcprime.cpp 1.35 KB
#include "calcprime.h"

CalcPrime::CalcPrime(QObject *parent)
    : QObject( parent )
    , m_bCalculate( false )
    , m_curValue( 0 )
    , m_timer()
    , oForm()
{
    m_timer.setInterval( 1 );
    m_timer.setSingleShot( true );

    connect( &m_timer, &QTimer::timeout, this, &CalcPrime::slotTimeOut );

    connect( &oForm, &CalcPrimeForm::signalStartButtonClicked, this, &CalcPrime::slotStartCalculation );
    connect( &oForm, &CalcPrimeForm::signalStopButtonClicked, this, &CalcPrime::slotStopCalculation );

    connect( this, &CalcPrime::signalCurrentValue, &oForm, &CalcPrimeForm::slotUpdateCurrentValue );
    connect( this, &CalcPrime::signalPrimeNumberFound, &oForm, &CalcPrimeForm::slotAddNewPrime );

    oForm.show();
}

void CalcPrime::slotStartCalculation()
{
    m_bCalculate = true;
    slotTimeOut();
}

void CalcPrime::slotStopCalculation()
{
    m_bCalculate = false;
}

void CalcPrime::slotTimeOut()
{
    emit signalCurrentValue( m_curValue );
    if( number_is_prime( m_curValue ) )
    {
        emit signalPrimeNumberFound( m_curValue );
    }

    m_curValue++;

    if( m_bCalculate )
    {
        m_timer.start();
    }
}

bool CalcPrime::number_is_prime(uint64_t number)
{
    uint64_t m = number / 2;

    for( uint64_t i = 2; i <= m; i++ )
    {
        if( number % i == 0 )
        {
            return false;
        }
    }

    return true;
}