Combinare le applicazioni di elaborazione in 1 Big Executable?

Ho costruito queste 3 applicazioni. Ciascuno di essi raccoglie i dati dall’input dell’utente e crea un file csv. 2 di loro si affidano al controller di movimento LEAP. Sto cercando di trovare un modo per combinarli tutti in un unico programma. Qualche consiglio su come potrei fare questo? Posso semplicemente racchiuderli in una class, quindi il programma principale può chiamarli singolarmente? O dovrei entrare e riscrivere tutto per lavorare insieme? Ogni applicazione fa un uso molto diverso di draw () con tutti i tipi di flag e chiamate noLoop () e Loop () per mettere in pausa se necessario per raccogliere i dati, quindi riscrivere tutti come 1 sarebbe difficile. Inoltre, il codice è estremamente sciatto nella sua forma attuale. Fondamentalmente ho violato via e ho riunito bit di randoms per convincere ognuno a fare ciò che dovevo fare. Ognuno è un disastro, quindi combinare tutto in un solo programma sembra un vero incubo.

Esiste comunque la possibilità di impacchettarli in modo che l’uno si chiuda automaticamente? Ti piace come in una pagina web puoi semplicemente colbind o aprire automaticamente un’altra pagina dopo la chiusura? Ogni applicazione deve essere eseguita una sola volta, quindi non devo preoccuparmi di andare avanti e indietro.

Alla fine ho intenzione di build una visualizzazione che si aggiorni in tempo reale con i dati di queste applicazioni. Penso che potrei build un’applicazione web per quella parte perché voglio che la visualizzazione sia visibile da più postazioni / piattaforms.

Ho incluso un collegamento a Dropbox a tutto il codice. Qualcuno ha suggerito di incorporare l’applicazione direttamente in Java utilizzando un’interfaccia Swing. Ora sto leggendo questo che penso sta spiegando come fare per farlo. Non ho mai usato Java Swing prima quindi sono attualmente perso ….

Link di riferimento

Ci sono alcune domande sull’implementazione … Vuoi una sola grande app o le vuoi anche come diverse? Vuoi eseguire le tre app finite o vuoi combinare il codice sorgente? Puoi anche trasformarli in librerie … Per quanto riguarda il tuo commento nell’altra domanda ( Crea più di una finestra di un singolo schizzo in Processing ), sì, ovviamente puoi creare un altro PApplet per memorizzare la tua applicazione. Ho modificato l’esempio un po ‘per mostrare.

Qui, ho creato due schizzi RedBG e BlueBG come questo:

int counter = 0; public void setup() { size(400, 400); counter = 0; } public void draw() { background(255, counter, counter); fill(255-counter); text(String.valueOf(counter), width*0.5, height*0.5, width, height); counter++; } 

Questo è quello rosso, quello blu ha lo background(counter, counter, 255); e funzionano entrambi come schizzi appropriati. Poi ho preso i due codici e li ho posizionati in diverse tabs in uno schizzo del controller e li ho avvolti in classi come questa:

 public class RedBG extends PApplet { int counter = 0; public void setup() { size(400, 400); counter = 0; } public void draw() { background(255, counter, counter); fill(255-counter); text(String.valueOf(counter), width*0.5, height*0.5, width, height); counter++; } } 

Quindi, la class controller è solo una modifica della mia risposta qui . Ecco il suo codice:

 import javax.swing.*; PApplet r, b; PFrame rf, bf; String nextWindow = "red"; int controllerCounter = 200; String control = "preparing..."; void setup() { size(400, 400); r = new RedBG(); b = new BlueBG(); frame.setTitle("controller"); fill(0); } void draw() { background(255); if (controllerCounter < 1) { switchState(); controllerCounter = 200; } control = null; control = "Launching " + nextWindow + " in: " + controllerCounter; text(control, width*0.5, height*0.5, width, height); controllerCounter--; } void switchState() { if (nextWindow == null) { stopApplet(b); nextWindow = "red"; } else if (nextWindow.equals("red")) { startApplet(r); nextWindow = "blue"; } else if (nextWindow.equals("blue")) { stopApplet(r); startApplet(b); nextWindow = null; } } void startApplet(final PApplet p) { if (p == null) return; final PFrame f = new PFrame(p); p.frame = f; f.setTitle(p.getClass() + " window"); //this thread is only necessary if you are restarting the PApplets Thread t = new Thread(new Runnable() { public void run() { p.setup(); } }); t.run(); } void stopApplet(PApplet p) { if (p == null || p.frame == null) return; p.dispose(); p.frame.dispose(); } public class PFrame extends JFrame { public PFrame(PApplet p) { setSize(400, 400); add(p); p.init(); show(); } } 

Le due classi che provengono dagli schizzi sono:

 public class BlueBG extends PApplet { int counter = 0; public void setup() { size(400, 400); counter = 0; } public void draw() { background(counter, counter, 255); fill(255-counter); text(String.valueOf(counter), width*0.5, height*0.5, width, height); counter++; } } 

e:

 public class RedBG extends PApplet { int counter = 0; public void setup() { size(400, 400); counter = 0; } public void draw() { background(255, counter, counter); fill(255-counter); text(String.valueOf(counter), width*0.5, height*0.5, width, height); counter++; } } 

In breve, prendi tutto il codice dai tre schizzi (tutte le tabs), gettali in una nuova scheda nello schizzo del controller e avvolgi con un PApplet che estende la class.

Purtroppo non è ansible avere le tabs dei tre schizzi nello schizzo del controller, a meno che non si modifichi il codice. Nell'esempio modificato che segue, solo lala1 () e lala3 () si trovano nella finestra blu. lala2 () si trova nella finestra del controller ...

 public class BlueBG extends PApplet { int counter = 0; public void setup() { size(400, 400); counter = 0; } public void draw() { background(counter, counter, 255); fill(255-counter); text(String.valueOf(counter), width*0.5, height*0.5, width, height); counter++; lala1(); lala2(); lala3(this); } public void lala1() { fill(255, 255, 0); ellipse(100, 100, 100, 100); } } public void lala2() { fill(255, 0, 255); ellipse(150, 150, 100, 100); } public void lala3(PApplet p) { p.fill(0, 255, 255); p.ellipse(200, 200, 100, 100); } 

Ultimo ma non meno importante, a volte il codice genererà NullPointerException e strani messaggi di errore come "manca un pushMatrix () per andare con quel popMatrix ()" su una chiamata di metodo in background. Ciò è causato dalla chiamata a setup() nel metodo startApplet() ed è un problema di concorrenza, quindi ha bisogno di un pensiero e di una conoscenza più approfonditi ... Come misura temporanea ho fatto call call setup() da un thread ... Se non stanno andando a ripetere il processo, quindi l'intera discussione non è necessaria, e non è necessario setup() ogni volta.!

PS Questa è una soluzione hacky-slash ... Il mio suggerimento è di unire i tuoi schizzi in uno e farlo correttamente ...

Soluzione semplice: basta creare un file batch e aggiungere una riga per ogni applicazione. Per fare in modo che l’attesa per la prossima chiamata sia così:

 START /WAIT MyApp1.exe START /WAIT MyApp2.exe START /WAIT MyApp3.exe 

Dai un’occhiata a http://www.onar3d.com/mother/ E ‘una libreria per VJ che combina una serie di piccoli sketch in una performance. Dovrai aggiungere del codice a ciascuno dei tuoi schizzi per farli parlare e dovrai scrivere un breve schizzo per sequenziare gli schizzi.

Tutte le app vivranno all’interno di uno schizzo di elaborazione, quindi non avrai una sola app e una finestra chiuse e quindi la prossima sarà aperta, sarà tutto un’esperienza unica. Se ciò è meno desiderabile, la soluzione di @Krowe è semplice e affidabile.