Threads demo

## 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.