in reply to Providing feedback to Web GUI (Mojolicious)

An easy first step would be to prepare a simple status page and set it to refresh periodically (meta refresh). Next step would be to use a timer in your javascript and only refresh the status, rather than refresh the whole page, so the back button works as expected.

This assumes your process records progress somewhere suitable for producing the status page. This could be to your application database, to a log file or whatever.

  • Comment on Re: Providing feedback to Web GUI (Mojolicious)

Replies are listed 'Best First'.
Re^2: Providing feedback to Web GUI (Mojolicious)
by Anonymous Monk on Nov 16, 2013 at 23:51 UTC

    running a process like this which takes a long time (especially a day or more!) from a web request is not really a good idea. It will be using one of the web request threads for all that time.

    A better solution would be to kick off a job elsewhere and release the web request thread. You can do this by putting a job on a job queue (have a look at beanstalk) then as soon as you have done this, return 'success' to the requesting web page. (success that you have scheduled the job).

    Then another process which is running as a client would take this job and process it. It can output it's current status and percentage done to a file. Another AJAX web request can interrogate that file and immediately return the job status.

    If you are only running one of these big jobs at a time then a single job queue client will suffice. If you want to run more in parallel then just run more clients.

    What is happening here is that each job client is running as a separate operating system process which means you don't have to worry about multi-threading.

Re^2: Providing feedback to Web GUI (Mojolicious)
by Anonymous Monk on Nov 20, 2013 at 17:46 UTC
    Not sure what mojo is or how useful this is to what you're working on, but SSE might be something to look into.
    #!/usr/bin/perl -- print "Content-Type: text/event-stream\n\n"; while(true){ print "event: server-time\n"; $num++; print "data: $num\n\n"; }
    generates an SSE stream.
    <!DOCTYPE HTML> <html> <head> <title>Server-Side Event</title> <script type="text/javascript"> function invokeSSE(){ var source = new EventSource('http://localhost/'); source.addEventListener('server-time', function(e) { document.getElementById('ticker').innerHTML = + '<br>'; }, false); source.addEventListener('open', function(e) { //Connection Open }, false); source.addEventListener('error', function(e) { if (e.readyState == EventSource.CLOSED) { alert("Connection closed"); } }, false); } </script> </head> <body onload="invokeSSE()"> <div id="ticker" name="ticker"> [TIME] </div> </body> </html>
    is a page to listen to SSE streams.