Come dovrei strutturare il mio progetto C ++ per consentire l'avvio, l'arresto e la sospensione del mio programma?

1

TL; DR: Come dovrei strutturare il mio progetto C ++ per consentire l'avvio, l'arresto e la sospensione del mio programma?

Descrizione:

Sto progettando un'applicazione che deve consentire agli utenti di avviare, mettere in pausa e interrompere l'esecuzione di un test. La stessa funzionalità di prova sarà abbastanza semplice, ma l'architettura che lo circonda è stata una sfida. Il programma è scritto su Linux, in C ++, usando QT per UI e NetBeans per l'IDE.

Il mio design di alto livello è il seguente:

  1. FIFO di esecuzione con ID azione. Le azioni verranno generate da un file di configurazione XML personalizzato
  2. All'avvio del programma, il "PC" (contatore del programma) inizierà l'esecuzione delle azioni dal FIFO, tenendo traccia dell'azione corrente e successiva
  3. Se viene premuto il pulsante di pausa, il PC cesserà di aumentare per consentire agli utenti di visualizzare lo stato di vari aspetti del test (si pensi a un punto di rottura)
  4. Se viene premuto il pulsante di avvio, il PC riprende
  5. Se viene premuto il pulsante stop, il PC verrà impostato su un "-1" figurativo per rappresentare non in esecuzione

Le mie domande specifiche sono:

Una logica del genere ha senso?

while notStopped
    if notPaused
        load action from fifo
        execute action
        pop
    else
        display paused / breakpoint data

Dove dovrebbe risiedere un'esecuzione come sopra (o revisionata)? La principale è una posizione appropriata? Un loop gigante è la best practice per questo caso d'uso?

Dove dovrebbero andare i dati "globali"? Ovviamente le variabili globali non sono un'opzione, ma come faranno tutti gli aspetti del programma a essere "messi in pausa" o "fermati"?

    
posta Alan 15.08.2017 - 21:42
fonte

2 risposte

4

Se si comprende che le pause non hanno effetto fino a quando l'azione corrente non è terminata, le altre parti del programma non dovrebbero preoccuparsi di quale sia la condizione di avvio / arresto / pausa. Non fanno nulla finché non li chiami dal tuo centralinista.

Non sono sicuro di farlo in Main invece che in qualche oggetto del dispatcher che può essere riutilizzato. Potresti aver accettato un oggetto di iterazione contenente qualsiasi azione tu abbia richiesto.

    
risposta data 16.08.2017 - 08:01
fonte
1

In termini di arresto e partenza; il modo migliore per gestire questo con il framework Qt è con un'architettura Signal / Slot.

Il vantaggio principale di questo è che estenderà questo processo in modo tale al tuo programma, e può essere facilmente controllato emettendo segnali.

In questo modo:

while notStopped
    if notPaused
        load action from fifo
        execute action
        pop
    else
        display paused / breakpoint data

può essere ottenuto con un'architettura come questa:

static bool isPaused(false);
static QEventLoop pauseTesting;


QObject::connect(pause, &QAction::triggered,[&](){
    isPaused = true;
}
QObject::connect(resume, &QAction::triggered,[&](){
    isPaused = false;
    pauseTesting.exit();
}

void breakpoint(QString debug="")
{
    if (isPaused) {
        qDebug() << debug; 
        pauseTesting.exec();
    }
}

void myTest() 
{
    qDebug() << "action 1";
    breakpoint();
    qDebug() << "action 2";
    breakpoint();
    qDebug() << "action 3";
    breakpoint();
    qDebug() << "action 4";
    breakpoint();
}
    
risposta data 30.09.2017 - 13:21
fonte

Leggi altre domande sui tag