Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method CanStart () as Boolean 
 | 
{ 
 | 
  Description: 
 | 
  [* 
 | 
    This method checks if the `LibOpt_Run` that corresponds to this `LibOpt_ControllerRun` can be started.  
 | 
    This method is called every `LibOpt_OptimizerRunController.PollingDuration` milliseconds until it returns `true`. 
 | 
  *] 
 | 
  TextBody: 
 | 
  [* 
 | 
    // evr3 Apr-26-2022 (created) 
 | 
    controller := this.OptimizerRunController(); 
 | 
     
 | 
    // The run that was requested the longest ago will start first, even when new runs could already start 
 | 
    // This is to ensure that new runs that request few threads won't block an old run that requests many threads. 
 | 
    canstart := controller.FirstUnstartedRun() = this  
 | 
                and controller.ConcurrentRuns() < controller.ConcurrentRunsMax() 
 | 
                and controller.CPUThreadsUsedTotal() + this.CPUThreadsRequested() <= controller.CPUThreadsMax();  
 | 
     
 | 
    if( canstart ) 
 | 
    { 
 | 
      // It is very tempting to call StartRun reactively so that we can make CanStart const.  
 | 
      // However, you don't want to do that, as the start attributes need to be set in the same transaction. 
 | 
      // This ensures that CPUThreadsUsedTotal is correct when another run calls CanStart. 
 | 
      this.Start(); 
 | 
    } 
 | 
     
 | 
    return canstart; 
 | 
  *] 
 | 
  InterfaceProperties { Accessibility: 'Module' } 
 | 
} 
 |