La ricorsione JSL è stata impeditaDal passaggio a JMP 13 da JMP 12 continuo a riscontrare errori dovuti alla "ricorsione JSL prevenuta". Per lo più questa è una buona cosa in quanto ho dovuto correggere le cattive pratiche nella mia base di codice, tuttavia spesso limita solo la funzionalità. Il punto in cui lo vedo attualmente è in uno dei miei rapporti che ho un pulsante "filtro", che esegue nuovamente la visualizzazione filtrando i dati specificati dall'utente. Se quel pulsante viene premuto troppe volte dall'utente, viene visualizzato un errore "Ricorsione JSL prevenuta" che uccide lo script. C'è un modo per spegnerlo? A volte voglio la ricorsione, può essere una buona cosa! Questo errore è stato la rovina della mia esistenza da JMP 13.
Ri: ricorsione JSL impeditaGrazie Craig, questo è stato molto utile. Sì, sto usando wait(0) nel mio script. Ho provato a disattivarlo poiché ho visto un grande aumento di velocità con la finestra di aggiornamento, ma credo che wait(0) sia quello che dovrò usare. Questo risponde a molte delle mie domande e mi aiuta a capire un po' meglio cosa sta succedendo sotto il cofano. Grazie!
Ri: ricorsione JSL impeditaStai usando le istruzioni wait()? Forse puoi passare all'uso di dt<<
L'ho usato per cercare di capire cosa sta succedendo:
New Window( "x",
t = Text Box( "" ),
Button Box( "updatewindow",
print("pressed updatewindow");
start = Tick Seconds();
For( i = 1, i < 1e3, i++,
t << settext( Char( i ) );
t << updatewindow;
);
stop = Tick Seconds();
t << settext( Char( stop - start, 4, 1 ) );
),
Button Box( "wait",
print("pressed wait");
start = Tick Seconds();
For( i = 1, i < 1e3, i++,
t << settext( Char( i ) );
Wait( 0 );
);
stop = Tick Seconds();
t << settext( Char( stop - start, 4, 1 ) );
)
);
cambia 1e3 in 1e4 se funziona troppo velocemente. Il pulsante "wait" consente l'elaborazione degli eventi, incluso il pulsante da premere durante lo script "wait" in esecuzione. Il pulsante "updatewindow" aggiorna solo la casella di testo e mette in coda ulteriori clic fino al termine dello script.
A volte wait() è inevitabile; quando una piattaforma viene avviata, non apparirà sullo schermo senza attendere(). E l'elaborazione in background di JMP richiede anche un wait() in uno script in loop (socket, runprogram, connessioni al database, probabilmente altri).
Il messaggio di registro non sembra che dovrebbe danneggiare nulla; Penso che sia solo un avviso che una seconda pressione dello stesso pulsante prima della fine dello script del pulsante è stata ignorata.
Ri: ricorsione JSL impeditaQuindi ho trovato una soluzione al mio problema, non ho idea del perché funzioni. La prima cosa che ho fatto è stata spostare i comandi << Ottieni selezionati nella funzione di esecuzione e passare semplicemente la casella combinata, e questo ha risolto il 99% dei miei problemi di ricorsione. Non capisco questa parte, quindi se qualcuno di JMP potesse illuminarmi perché questo sarebbe lo apprezzerei.
La seconda cosa che dovevo fare era disabilitare il pulsante mentre il codice era in esecuzione, b/c se un utente avesse fatto doppio clic abbastanza velocemente avrebbe causato un errore di ricorsione a causa del primo clic del pulsante che stava ancora tentando di eseguire. Questa parte ha senso per me, ma non sembra che dovrei codificare attorno ad essa. Un utente che fa clic su un pulsante non dovrebbe causare un errore di ricorsione. Al massimo, dovrebbe semplicemente aggiungere il nuovo clic allo stack di elaborazione; e almeno dovrebbe semplicemente ignorare il clic in più. Non dovrebbe mai effettivamente provare a eseguirlo di nuovo per causare il problema della ricorsione.
//Old Script
BBRun = button box("Run Filter",
layerId = layer_cb << Get Selected;
classId = class_cb << Get Selected;
runFunction(dt, layerid, classid);
)
//New Script
BBRun = button box("Run Filter",
BBRun << Enable(0);
runFunction(dt, layer_combobox, class_combobox);
BBRun << Enable(1);
)<BR /><BR />//Run Function for reference<BR />runFunction = function({dt, layer_cb, class_cb}, {Default Local}, <BR /> //Grab data<BR /> layerId = layer_cb << Get Selected;<BR /> classId = class_cb << Get Selected;<BR /> <BR /> //Create namespace to pass variables<BR /> If( !Namespace Exists( "filterCode_script" ),<BR /> FC = New Namespace( "filterCode_script" ),<BR /> FC = Namespace( "filterCode_script" )<BR /> );<BR /> //get unique defects<BR /> FC:defects = dt:defects[dt << Get Rows Where(:LAYER_ID == layerId & :CLASS_ID == classId)];<BR /> <BR /> //Create display window for subset<BR /> include("$ADDIN_HOME(myaddin)\Includes\filterWindow.include.jsl", <<NEW context=""></NEW> FC << Delete;<BR /> <BR />);<BR />