[Qt-interest] Fwd: Re: Thread calling Thread and Signal/Slots

Matthias Pospiech matthias.pospiech at gmx.de
Mon Mar 30 20:16:36 CEST 2009


Thiago Macieira schrieb:
> One more thing: that m_stopped variable is not protected by any mutexes. Is it 
> volatile?
>
>   
Yes, it is volatile.
Does QtSoftware provide an example which uses Signal/Slots within QThreads?

At the moment I only send signals (they are identical in both Threads)
signals:
    void changedIteration(int);
    void finishedCalculation(bool);

which are catched in the gui. But my impression was, that if I wanted to 
catch a signal from the 2nd in the 1st thread I would require an 
additional loop.
Especially because then I could catch finishedCalculation(), instead of 
waiting for 'while (FresnelVariation->isRunning() && (!m_stopped)) ', 
although I am unsure which approach would be better.


Signal/Slots in the GUI:
-------------------------------------
void DialogChirpedGrating::connectSignalSlots()
{
    connect(ChirpedGratingVariation, SIGNAL(changedIteration(int)), 
SLOT(OnFresnelVariationChangedIteration(int)));
    connect(ChirpedGratingVariation, 
SIGNAL(finishedCalculation(bool)),SLOT(OnFresnelVariationFinished(bool)));
    connect(ChirpedGratingVariation->FresnelVariation, 
SIGNAL(changedIteration(int)), 
SLOT(OnSingleFresnelVariationChangedIteration(int)));   
}


Here is a very short version of the Threads:
-------------------------------------
class ChirpedGratingVariationThread : public QThread
{
    Q_OBJECT
public:
    ChirpedGratingVariationThread()
        : QThread()
        , FresnelVariation(new FresnelVariationThread)
        , m_stopped(false)
        , m_Iteration(0)
    {

    }
    virtual ~ChirpedGratingVariationThread()
    {
        delete FresnelVariation;
    }

public:
    FresnelVariationThread  * FresnelVariation;
private:
    bool volatile m_stopped;

    int m_Iteration;

public:
     void run()
    {       
           Init();

        for (double period = m_Period.start; period <= m_Period.end; 
period+=m_Period.step)
        {
            for (double chirp = m_Chirp.start; chirp <= m_Chirp.end; 
chirp+=m_Chirp.step)
            {

                if (m_stopped)  break;
                IterationStep(period, chirp);

                // wait for FresnelVariation to be finished
                while (FresnelVariation->isRunning() && (!m_stopped)) 
                {                    sleep(100);                }
                m_Iteration++;
                emit changedIteration(m_Iteration);
            }
        }

        emit finishedCalculation(!m_stopped);
    }

    void IterationStep(double period, double chirp)
    {
...
        FresnelVariation->start();
    }


signals:
    void changedIteration(int);
    void finishedCalculation(bool);

};
#endif
-------------------------------------------------
class FresnelVariationThread : public QThread
{
    Q_OBJECT
public:
    FresnelVariationThread(QObject* parent = 0)
    {
    }
    virtual ~FresnelVariationThread()
    {
    }


public:
 
    void run()
    {       
        m_stopped = false;
        Init();
        Calculation();
        emit finishedCalculation(!m_stopped);
        m_stopped = true;
    }
    void stop()
    {
        m_stopped = true;
    }

private:
 
    void Calculation()
    {
       
        for(double z = m_start; z < m_end; z+=m_step)
        {           
            if (m_stopped)
                break;
...
            m_Iteration ++;
            emit changedIteration(m_Iteration);
        }
        delete [] Array;       
    }

private:
    int m_Iteration;
    bool volatile m_stopped;

signals:
    void changedIteration(int);
    void finishedCalculation(bool);

};
#endif

----------------------------------

Matthias



More information about the Qt-interest-old mailing list