I'm trying to simulate `setTimeout` with `spawn` but apparently it cannot work 
properly
    
    
    import threadpool
    from os import sleep
    
    type
      TimerObj[T] = object
        doit: bool
        time: int
        when T isnot void:
          arg: T
          exec: ExecProc[T]
        else:
          exec: ExecNoArg
      
      ExecNoArg = proc()
      
      Timer[T] = ref TimerObj[T]
      PTimer[T] = ptr TimerObj[T]
    
    proc runit(x: PTimer[void], duration: int) =
      sleep duration
      if x.doit:
        x.exec()
    
    proc setTimeout(exec: ExecNoArg, duration: int): Timer[void] =
      var temp: Timer[void]
      new temp
      temp.exec = exec
      temp.doit = true
      temp.time = duration
      
      spawn runit(temp[].addr, duration)
      
      result = temp
    
    proc cancelTimeout[T](timer: var Timer[T]) =
      timer.doit = false
    
    var timer = setTimeout(
      (proc() = echo "interweaving echo"),
      300)
    
    cancelTimeout timer # should set the branch false and won't run the supply 
proc
    
    sleep 400           # if it works, it'll silently end
    

How to make it works correctly?

Also, if any, please tell me a better approach for this.

Thanks in advance.

Reply via email to