Crea / distruggi più thread per animazioni / effetti di luce

0

Sto sviluppando un programma per Razer Deathadder e Firefly, creerò nuovi effetti di luce per Firefly. Lo sto facendo in C # con la libreria di Colore.

Ora questi effetti di luce verranno creati usando Thread con while(true) istruzioni, ma come posso controllare e distruggere i thread e quindi riattivarli di nuovo quando l'utente ha premuto un pulsante / radiobutton?

In questo momento i thread si sovrappongono o si disattivano e non si "riaccendono", c'è un modo più semplice per farlo?

  • Non ho provato altro che creare funzioni per uccidere i thread ma poi non si attiveranno più.

Ecco come l'ho fatto:

private void button1_Click(object sender, EventArgs e) {
    Thread effect = new Thread(new ThreadStart((Effect));
    effect.Start();
}

private void Effect() {
    while(true) {
       // lightning effect will go here
    }
}
    
posta Liam Rabe 16.01.2016 - 09:46
fonte

1 risposta

0

Penso che usare i thread per questo sia eccessivo, soprattutto perché (presumo) quei thread rimarranno inattivi per la maggior parte del tempo.

Invece, ciò che puoi fare è usare async - await per essere più efficiente. Se hai davvero bisogno di eseguire il codice su un thread separato da quello corrente, puoi utilizzare Task.Run() per quello.

Per controllare se il codice è abilitato o meno, non è necessario interrompere il codice, puoi semplicemente metterlo in pausa.

Per riuscirci, puoi controllare periodicamente se il codice è abilitato:

while (true)
{
    if (isEffectEnabled)
    {
        // lightning effect will go here
    }
    else
    {
        await Task.Delay(someReasonableDelay);
    }
}

Oppure puoi utilizzare AsyncManualResetEvent dalla libreria AsyncEx che ti consente di attendere fino all'attivazione dell'effetto:

while (true)
{
    await isEffectEnabledEvent.WaitAsync();
    // lightning effect will go here
}
    
risposta data 16.01.2016 - 15:19
fonte

Leggi altre domande sui tag