Пример #1
0
        //Constructor MUST be called on UI thread (we capture the UI synchronization context for use later)
        public JobStore()
        {
            IsLocalExecution         = true;
            CurrentExecutionPoolText = "Local Execution";
            PhysicalCoreCount        = LocalPool.GetNumberOfPhysicalCores();
            SelectedThreadCount      = Properties.Settings.Default.SelectedThreadCount; //TODO: load setting from a previous session?
            if (SelectedThreadCount == 0)
            {
                SelectedThreadCount = PhysicalCoreCount;
            }
            ThreadOptionsList = Enumerable.Range(1, USER_THREAD_COUNT_MAX).ToList();
            if (PhysicalCoreCount > USER_THREAD_COUNT_MAX)
            {
                ThreadOptionsList.Add(PhysicalCoreCount);
            }

            UiTaskScheduler = TaskScheduler.FromCurrentSynchronizationContext();

            TrackedJobs             = new List <JobViewModel>();
            Manager                 = new JobManagerFramework.JobManager(SelectedThreadCount);
            Manager.Server.IsRemote = false;
            Manager.LoadSavedJobs();

            Manager.JobAdded           += Manager_JobAdded;
            Manager.JobCollectionAdded += JobCollectionAddedHandler;

            this.TrackedJobsChanged += (sender, args) =>
            {
                PropertyChanged.Notify(() => HasNoRunningJobs);
            };
        }
Пример #2
0
        public void UsingLocalPool()
        {
            var localPool = new LocalPool();

            var str1 = localPool.GetOrCreate("string");
            var str2 = localPool.GetOrCreate("str");
            var str3 = localPool.GetOrCreate(str2 + "ing");
            var str4 = localPool.GetOrCreate(GetFromInput());

            Assert.True(ReferenceEquals(str1, str3));
            Assert.True(ReferenceEquals(str1, str4));
            Assert.True(ReferenceEquals(str3, str4));
        }
Пример #3
0
 /// <summary>
 /// <see cref="LockPoolPointer(int)"/> のスレッド ローカル版。
 ///
 /// マルチスレッド動作はあきらめる。
 /// 用途がかなり限られるものの、GCに頼らないメモリ管理としてはオーバーヘッド極小のはず。
 /// ここまで削ってまだ<see cref="GarbageCollection(int)"/>より2~3倍遅い。
 /// Mark and Sweep はほんとに速い。
 ///
 /// これが Mark and Sweep より遅くなってそうな要因は、
 /// - プールを準備する部分が重い
 /// - 検索アルゴリズムの問題
 /// - 一時変数 q が増えてるのでこれが最適化を阻害
 /// - Delete 呼び出しのコスト
 /// というあたり。
 /// </summary>
 public static (int x, int y) LocalPoolPointer(int loops)
 {
     using (var pool = new LocalPool(20))
         return(Pointer(new LocalPool(20), loops));
 }