Sciter UI, threads demo

The Start Task onClick handler is defined as

$(#start-task).onClick = function()
{
  var taskElem = $(div#tasks > select)
      .$append(<option>Task { ++taskNo }
               <progress max=100 />
               <span.result /></option>);
  function onProgress(p100) {
    taskElem.$(progress).value = p100;
  }
  function onDone(taskId) {
    taskElem.$(span.result).text = "Done!";
    taskElem.$(progress).remove();
  }
  view.exec_task(taskId, onProgress, onDone);
}
      

It defines couple of callback functions and calls view.exec_task() with them.

The view.exec_task() native method is implemented in EventHandler::exec_task().

The EventHandler::exec_task() starts worker thread passing taskNo, onProgress and onDone parameters to it.

Worker thread body is defined in Rust code as:

// worker thread body, simulate time consuming task
fn thread_body(task_no: i32, progress: Value, done: Value)
{
  for i in 1..100 {
    std::thread::sleep(std::time::Duration::from_millis(100));
    progress.call(None, &make_args!(i), None).unwrap(); // report task progress
  }
  // report task completion,
  // we can pass some result data here, for now just taskId
  done.call(None, &make_args!(task_no), None).unwrap();
}
      

As you see it calls passed callback functions.