Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
01/13/17 12:55:06 (8 years ago)
Author:
abeham
Message:

#2701: Updated branch to trunk

Location:
branches/MemPRAlgorithm
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • branches/MemPRAlgorithm

  • branches/MemPRAlgorithm/HeuristicLab.Optimization

  • branches/MemPRAlgorithm/HeuristicLab.Optimization/3.3/Algorithms/Algorithm.cs

    r14185 r14562  
    289289    public event EventHandler Stopped;
    290290    protected virtual void OnStopped() {
    291       foreach (IStatefulItem statefulObject in this.GetObjectGraphObjects(new HashSet<object>() { Runs }).OfType<IStatefulItem>()) {
    292         statefulObject.ClearState();
    293       }
    294       runsCounter++;
    295       runs.Add(new Run(string.Format("{0} Run {1}", Name, runsCounter), this));
    296       ExecutionState = ExecutionState.Stopped;
    297       EventHandler handler = Stopped;
    298       if (handler != null) handler(this, EventArgs.Empty);
     291      try {
     292        foreach (
     293          IStatefulItem statefulObject in
     294          this.GetObjectGraphObjects(new HashSet<object>() {Runs}).OfType<IStatefulItem>()) {
     295          statefulObject.ClearState();
     296        }
     297        runsCounter++;
     298        try {
     299          runs.Add(new Run(string.Format("{0} Run {1}", Name, runsCounter), this));
     300        }
     301        catch (ArgumentException e) {
     302          OnExceptionOccurred(new InvalidOperationException("Run creation failed.", e));
     303        }
     304      }   
     305      finally {
     306        ExecutionState = ExecutionState.Stopped;
     307        EventHandler handler = Stopped;
     308        if (handler != null) handler(this, EventArgs.Empty);
     309      }
    299310    }
    300311    public event EventHandler<EventArgs<Exception>> ExceptionOccurred;
  • branches/MemPRAlgorithm/HeuristicLab.Optimization/3.3/Algorithms/BasicAlgorithm.cs

    r14185 r14562  
    2424using System.Threading.Tasks;
    2525using HeuristicLab.Common;
     26using HeuristicLab.Core;
    2627using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    2728
     
    2930  [StorableClass]
    3031  public abstract class BasicAlgorithm : Algorithm, IStorableContent {
     32
     33    private bool pausePending;
     34    private DateTime lastUpdateTime;
     35
    3136    public string Filename { get; set; }
    3237
     38    public abstract bool SupportsPause { get; }
     39
    3340    [Storable]
    34     private ResultCollection results;
     41    private bool initialized;
     42    [Storable]
     43    private readonly ResultCollection results;
    3544    public override ResultCollection Results {
    3645      get { return results; }
     
    5867      base.Prepare();
    5968      results.Clear();
     69      initialized = false;
    6070      OnPrepared();
    6171    }
     
    6474      base.Start();
    6575      CancellationTokenSource = new CancellationTokenSource();
     76      pausePending = false;
     77      OnStarted();
    6678
    67       OnStarted();
    68       Task task = Task.Factory.StartNew(Run, cancellationTokenSource.Token, cancellationTokenSource.Token);
     79      Task task = Task.Factory.StartNew(Run, CancellationTokenSource.Token, CancellationTokenSource.Token);
    6980      task.ContinueWith(t => {
    7081        try {
    7182          t.Wait();
    72         } catch (AggregateException ex) {
     83        }
     84        catch (AggregateException ex) {
    7385          try {
    7486            ex.Flatten().Handle(x => x is OperationCanceledException);
    75           } catch (AggregateException remaining) {
     87          }
     88          catch (AggregateException remaining) {
    7689            if (remaining.InnerExceptions.Count == 1) OnExceptionOccurred(remaining.InnerExceptions[0]);
    7790            else OnExceptionOccurred(remaining);
     
    8093        CancellationTokenSource.Dispose();
    8194        CancellationTokenSource = null;
    82         OnStopped();
     95        if (pausePending) OnPaused();
     96        else OnStopped();
    8397      });
    8498    }
    8599
    86100    public override void Pause() {
    87       throw new NotSupportedException("Pause is not supported in basic algorithms.");
     101      // CancellationToken.ThrowIfCancellationRequested() must be called from within the Run method, otherwise pause does nothing
     102      // alternatively check the IsCancellationRequested property of the cancellation token
     103      if (!SupportsPause)
     104        throw new NotSupportedException("Pause is not supported by this algorithm.");
     105
     106      base.Pause();
     107      pausePending = true;
     108      CancellationTokenSource.Cancel();
    88109    }
    89110
     
    92113      // alternatively check the IsCancellationRequested property of the cancellation token
    93114      base.Stop();
    94       CancellationTokenSource.Cancel();
     115      if (ExecutionState == ExecutionState.Paused) OnStopped();
     116      else CancellationTokenSource.Cancel();
    95117    }
    96118
    97 
    98     private DateTime lastUpdateTime;
    99119    private void Run(object state) {
    100120      CancellationToken cancellationToken = (CancellationToken)state;
     
    105125      timer.Start();
    106126      try {
     127        if (!initialized)
     128          Initialize(cancellationToken);
     129        initialized = true;
    107130        Run(cancellationToken);
    108       } finally {
     131      }
     132      finally {
    109133        timer.Elapsed -= new System.Timers.ElapsedEventHandler(timer_Elapsed);
    110134        timer.Stop();
     
    113137    }
    114138
     139    protected virtual void Initialize(CancellationToken cancellationToken) { }
    115140    protected abstract void Run(CancellationToken cancellationToken);
    116141
Note: See TracChangeset for help on using the changeset viewer.