예제 #1
0
		protected WorkerBase()
		{
			_name = this.GetType().Name;
			_disabled = false;
			_canPauseAndContinue = false;
			_state = WorkerState.Stopped;
		}
예제 #2
0
 public WorkerInfo()
 {
     State = WorkerState.Dead;
     URL = "";
     RemoteJobId = "";
     StartTime = DateTime.Now;
     LastKeepalive = DateTime.MinValue;
 }
		public WorkerStateChangedEventArgs(string actionName, WorkerState state, Exception exception)
		{
			if(string.IsNullOrWhiteSpace(actionName))
				throw new ArgumentNullException("actionName");

			_actionName = actionName.Trim();
			_state = state;
			_exception = exception;
		}
예제 #4
0
		protected WorkerBase(string name)
		{
			if(string.IsNullOrWhiteSpace(name))
				throw new ArgumentNullException("name");

			_name = name.Trim();
			_disabled = false;
			_canPauseAndContinue = false;
			_state = WorkerState.Stopped;
		}
예제 #5
0
        public WorkerStateChangedEventArgs(string actionName, WorkerState state, Exception exception)
        {
            if (string.IsNullOrWhiteSpace(actionName))
            {
                throw new ArgumentNullException("actionName");
            }

            _actionName = actionName.Trim();
            _state      = state;
            _exception  = exception;
        }
 public void ReportProgress(WorkerState Job, int Perc, object UserState)
 {
     if (ProgressChanged != null)
     {
         ProgressChangedEventArgs e = new ProgressChangedEventArgs(Perc, UserState);
         //int id = WorkJob[Job];
         int idx = StateTable.IndexOf(Job);
         int id  = IDTable[idx];
         ProgressChanged(id, this, e);
     }
 }
예제 #7
0
 public TransitionBundle ChangeState(WorkerStateTrigger trigger, WorkerState currentState)
 {
     foreach (TransitionBundle bundle in workerTransitionsDic[trigger])
     {
         if (bundle.Source == currentState)
         {
             return(bundle);
         }
     }
     return(new TransitionBundle(currentState, currentState));
 }
예제 #8
0
        protected void OnStateChange(object source, WorkerState state)
        {
            StateChangeHandlerEventArgs args = new StateChangeHandlerEventArgs();

            args.State = state;

            if (StateChange != null)
            {
                StateChange.Invoke(source, args);
            }
        }
예제 #9
0
 private void Idle()
 {
     UpdateWorkerStatusCounter();
     if (connection.WorkerShouldRun())
     {
         Trace.WriteLine("Switching worker to Loading");
         currentState        = WorkerState.LOADING;
         workerStatusCounter = 0;
         visitedUrls.Clear();
     }
 }
예제 #10
0
    private void OnTriggerEnter(Collider other)
    {
        WorkerStateTrigger trigger = workerStateScripts[currentState].Collide(other, ref health);

        if (trigger != WorkerStateTrigger.Null)
        {
            TransitionBundle transition = workerStateTransition.ChangeState(trigger, currentState);
            currentState = transition.Destination;
            Output(transition.Output, other);
        }
    }
예제 #11
0
 public void LaunchWorkers(Func <object, bool> func, object[] inputs)
 {
     Initialize();
     for (int i = 0; i < _number; i++)
     {
         WorkerState ws = new WorkerState(func, inputs[i], i);
         ThreadPool.QueueUserWorkItem(this.DoWork, ws);
     }
     WaitHandle.WaitAll(events);
     _workComplete = true;
 }
        private void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            /* Create an FTP Request */
            ftpRequest = (FtpWebRequest)FtpWebRequest.Create(data.adress + "/" + remoteFile);
            /* Log in to the FTP Server with the User Name and Password Provided */
            ftpRequest.Credentials = new NetworkCredential(data.login, data.password);
            /* When in doubt, use these options */
            ftpRequest.UseBinary  = true;
            ftpRequest.UsePassive = true;
            ftpRequest.KeepAlive  = true;
            /* Specify the Type of FTP Request */
            ftpRequest.Method = WebRequestMethods.Ftp.DownloadFile;
            /* Establish Return Communication with the FTP Server */
            ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
            /* Get the FTP Server's Response Stream */
            ftpStream = ftpResponse.GetResponseStream();
            /* Open a File Stream to Write the Downloaded File */
            Directory.CreateDirectory(Path.GetDirectoryName(localFile));
            localFileStream = new FileStream(localFile, FileMode.Create);
            /* Buffer for the Downloaded Data */
            byte[] byteBuffer     = new byte[bufferSize];
            int    bytesRead      = ftpStream.Read(byteBuffer, 0, bufferSize);
            int    totalBytesRead = bytesRead;

            /* Download the File by Writing the Buffered Data Until the Transfer is Complete */
            while (bytesRead > 0)
            {
                if (cancel)
                {
                    localFileStream.Close();
                    ftpRequest.Abort();
                    ftpStream.Close();
                    ftpResponse.Close();
                    ftpRequest      = null;
                    ftpResponse     = null;
                    ftpStream       = null;
                    localFileStream = null;
                    e.Cancel        = true;
                    return;
                }
                localFileStream.Write(byteBuffer, 0, bytesRead);
                bytesRead       = ftpStream.Read(byteBuffer, 0, bufferSize);
                totalBytesRead += bytesRead;
                double      progress = totalBytesRead * 100.0 / fileSize;
                WorkerState state    = new WorkerState(fileSize, totalBytesRead);
                worker.ReportProgress((int)progress, state);
            }

            /* Resource Cleanup */
            localFileStream.Close();
            ftpStream.Close();
            ftpResponse.Close();
            ftpRequest = null;
        }
예제 #13
0
 public void Pause(bool isVerify, string msg, int waitSeconds)
 {
     if (WorkerState != WorkerState.WORKING)
     {
         throw new Exception("线程不是运行状态无法暂停");
     }
     this.WorkerState = WorkerState.PAUSE;
     this.Download(this, new GoodsDownloadWorkerEventArgs {
         BtnQueryTitle = "继续", BtnStopEnabled = true, IsComppleted = false, Msg = msg
     });
     this.OnPausing(isVerify, msg, waitSeconds);
 }
예제 #14
0
        public void Start()
        {
            lock (_lock)
            {
                if (_state == WorkerState.Stopped)
                {
                    _requestedState = _state = WorkerState.Running;
                    _eventWaiter.Reset();

                    _workerTask = new Thread(() =>
                    {
                        while (true)
                        {
                            if (_state == WorkerState.Stopped) break;

                            bool haveMoreWork = false;
                            if (_state == WorkerState.Running)
                            {
                                try
                                {
                                    haveMoreWork = _workerJob();
                                }
                                catch
                                {
                                    _requestedState = _state = WorkerState.Stopped;
                                    _isFaulted = true;
                                    throw;
                                }

                                // Check if state has been changed in workerJob thread.
                                if (_requestedState != _state && _requestedState == WorkerState.Stopped)
                                {
                                    _state = _requestedState;
                                    break;
                                }
                            }

                            if (!haveMoreWork || _state == WorkerState.Suspended) _eventWaiter.WaitOne(Timeout.Infinite);
                            _state = _requestedState;
                        }
                    });
                    _workerTask.Name = Name;
                    _workerTask.IsBackground = true;

                    _workerTask.Start();
                    SpinWait.SpinUntil(() => _workerTask.IsAlive);
                }
                else
                {
                    throw new InvalidOperationException("The worker is already started.");
                }
            }
        }
예제 #15
0
 public void AssignToConstruction(EC_Base assignedBase)
 {
     if (state == WorkerState.Idle)
     {
         PlayerManager.Instance.RemoveIdleWorker(this);
     }
     this.assignedBase = assignedBase;
     state             = WorkerState.Construction;
     constructionState = ConstructionState.Idle;
     nextScanTime      = Time.time;
     ChangeAcessories();
 }
예제 #16
0
        public static IJob CreateJob(JobDescriptor description, WorkerState worker, ILocator locator)
        {
            var jobType = Type.GetType(description.JobType);

            if (jobType == null)
            {
                throw new TypeAccessException("Could not create a type from " + description.JobType);
            }
            var instance = Activator.CreateInstance(jobType, description, worker.Id, locator) as IJob;

            return(instance);
        }
예제 #17
0
    private void OnTriggerExit(Collider other)
    {
        if (other.gameObject.tag == "Tiles")
        {
            state = WorkerState.Seeking;
            print("state SEEK");
        }

        if (other.gameObject.tag == "Enemy")
        {
        }
    }
예제 #18
0
 private void Move()
 {
     if (transform.position.x < 34 || transform.position.x > 50)
     {
         direction *= -1;
         pointlight[0].SetActive(direction.x < 0);
         pointlight[1].SetActive(direction.x > 0);
     }
     sprite.flipX       = direction.x > 0;
     transform.position = Vector3.MoveTowards(transform.position, transform.position + direction, speed * Time.deltaTime);
     state = WorkerState.run;
 }
예제 #19
0
    void LoseHealth()
    {
        DestructableObstacleCollision other   = Instantiate(testSample);
        WorkerStateTrigger            trigger = workerStateScripts[currentState].Collide(other.GetComponent <Collider>(), ref health);

        if (trigger != WorkerStateTrigger.Null)
        {
            TransitionBundle transition = workerStateTransition.ChangeState(trigger, currentState);
            currentState = transition.Destination;
            Output(transition.Output);
        }
    }
예제 #20
0
        protected WorkerBase(string name)
        {
            if (string.IsNullOrWhiteSpace(name))
            {
                throw new ArgumentNullException("name");
            }

            _name                = name.Trim();
            _disabled            = false;
            _canPauseAndContinue = false;
            _state               = WorkerState.Stopped;
        }
예제 #21
0
파일: Worker.cs 프로젝트: rumkit/GZippy
 /// <summary>
 /// Worker will query bytes from payloadSource and pass to job untill payloadSource returns null
 /// </summary>
 /// <param name="payloadSource">source of payload to work with</param>
 /// <param name="job">data processing routine</param>
 public void QueueJob(Func <Worker, byte[]> payloadSource, Func <byte[], byte[]> job, Action onComplete)
 {
     if (State != WorkerState.Idle)
     {
         throw new ConcurrencyException("You have started new job without finishing the previous one.");
     }
     _payloadSource = payloadSource;
     _job           = job;
     _jobCompleted  = onComplete;
     State          = WorkerState.Busy;
     _readyToWork.Set();
 }
예제 #22
0
        private void Worker()
        {
            var state = new WorkerState();

            try
            {
                while (!_cancelTokenSource.IsCancellationRequested)
                {
                    LoggingEvent loggingEvent;
                    if (_queue.TryTake(
                            out loggingEvent,
                            ToMillseconds(GetWaitTimeOut(state)),
                            _cancelTokenSource.Token))
                    {
                        AddLoggingEvent(state, loggingEvent);
                    }

                    var now = DateTime.UtcNow;
                    if ((state.Buffer.Count > 0 && (state.LastSend + HolddownPeriod) < now) ||
                        state.Buffer.Count > MaximumEventsPerMessage)
                    {
                        SendEvents(state);
                    } // else we won't sent the events
                }
            }
            catch (OperationCanceledException)
            {
                LogLog.Debug(typeof(HtmlSmtpAppender), "Cancellation request for html smtp worker thread");
                return;
            }
            catch (Exception e)
            {
                LogLog.Error(typeof(HtmlSmtpAppender), string.Format("Unexpected excpetion in html smtp worker: {0}", e.Message), e);
            }
            finally
            {
                // Flush any outstanding events
                LoggingEvent loggingEvent;
                while (_queue.TryTake(out loggingEvent))
                {
                    AddLoggingEvent(state, loggingEvent);
                }

                if (state.Buffer.Count > 0)
                {
                    LogLog.Debug(typeof(HtmlSmtpAppender), "Sending residual html email events");
                    SendEvents(state);
                }

                LogLog.Debug(typeof(HtmlSmtpAppender), "HtmlSmtpAppender worker thread exit");
            }
        }
예제 #23
0
    /// <summary>
    /// 建造结束
    /// </summary>
    public void BuildFinish()
    {
        _buildTargeter = null;

        if (_state == WorkerState.Working)
        {
            //  设置下班状态
            _state = WorkerState.FinishWork;

            //  移动回工人小屋
            DoActionMove(GetDoorOfTheWorkerHouse());
        }
    }
예제 #24
0
    protected virtual void OnTriggerEnter2D(Collider2D collider)
    {
        Character user = collider.GetComponent <Character>();

        if (user && user is Character)
        {
            attack = true;
            state  = WorkerState.attack;
            user.ReciveDamage();
            StartCoroutine(Attack());
            sprite.flipX = !user.usrSprite.flipX; // turn sprte to the enemy
        }
    }
예제 #25
0
    public void EnableWorker(bool enable)
    {
        GetComponent <BoxCollider>().enabled = enable;

        if (enable)
        {
            state = WorkerState.Movable;
        }
        else
        {
            state = WorkerState.Immovable;
        }
    }
예제 #26
0
    private void OnDisable()
    {
        magnetColliderObject.SetActive(false);
        currentState       = WorkerState.Dead;
        haltedState        = WorkerState.Dead;
        health             = 1;
        level              = 0;
        rb.velocity        = Vector3.zero;
        transform.position = new Vector3(0, wc.groundLevel, 0);
        tag = "Worker";

        Speed.onValueChanged.RemoveListener(ChangeAnimationSpeed);
    }
예제 #27
0
    IEnumerator StartRepair()
    {
        // Gets the machine to begin repairing
        machineCalledScript.GetRepaired();

        Debug.Log("Worker is now repairing the machine");
        yield return(StartCoroutine(RepairMachine()));

        // ^^ This coroutine waits for the RepairMachine coroutine to finish before doing its tasks.

        doingSomething = false;
        state          = WorkerState.Standby;
    }
예제 #28
0
    private void Update()
    {
        //healthText.text = health.ToString();
        // Check if there is an output trigger from current state
        WorkerStateTrigger trigger = workerStateScripts[currentState].InputTrigger();

        if (trigger != WorkerStateTrigger.Null)
        {
            TransitionBundle transition = workerStateTransition.ChangeState(trigger, currentState);
            currentState = transition.Destination;
            Output(transition.Output);
        }
    }
예제 #29
0
 public void AssignToHarvesting(EC_HarvestingBuilding harvester)
 {
     if (state == WorkerState.Idle)
     {
         PlayerManager.Instance.RemoveIdleWorker(this);
     }
     this.assignedHarvester = harvester;
     assignedHarvesterType  = harvester.type;
     state           = WorkerState.Harvesting;
     harvestingState = HarvestingState.Idle;
     nextScanTime    = Time.time;
     ChangeAcessories();
 }
예제 #30
0
    public void AssignToIdle()
    {
        if (state == WorkerState.Depositing)
        {
            despositionBuilding.GetComponent <IDepositioneable <B_Worker> >().OnWorkerCancelsTasks(this);
        }

        state = WorkerState.Idle;
        nextIdleMovementTime = 0;
        PlayerManager.Instance.AddIdleWorker(this);
        nextIdleMovementTime = UnityEngine.Random.Range(0, idleMovementInterval);
        ChangeAcessories();
    }
예제 #31
0
 public SubscriptionState(
     string name,
     bool isStarted,
     bool isStartable,
     QueueState[] queueStates,
     WorkerState[] workerStates)
 {
     Name = name;
     IsStarted = isStarted;
     IsStartable = isStartable;
     QueueStates = queueStates;
     Workers = workerStates;
 }
예제 #32
0
        public void TaskFunc()
        {
            bool            hasError = false;
            DateTime        start    = DateTime.Now;
            List <PopGoods> goods    = new List <PopGoods>();

            try
            {
                this.WorkerState = WorkerState.WORKING;
                this.isStop      = false;
                this.OnDownload("暂停", true, "下载线程已开始执行", false);
                int pageIndex = 0;
                while (this.WaitGoOn())
                {
                    this.OnDownload("暂停", true, "正在下载第:" + (pageIndex + 1) + "页", false);
                    List <PopGoods> ggs = null;
                    if (shop.AppEnabled)
                    {
                        ggs = ServiceContainer.GetService <GoodsService>().SearchPopGoods(shop, state, pageIndex, 50).Datas;
                    }
                    else
                    {
                        ggs = this.QueryHtmlGoodsPage(shop, pageIndex + 1, state);
                    }
                    if (ggs == null || ggs.Count < 1)
                    {
                        break;
                    }
                    goods.AddRange(ggs);
                    pageIndex++;
                    this.OnDownload("暂停", true, "已经下载:" + goods.Count, false);
                    this.OnDownloadData(ggs);
                }
            }
            catch (Exception ex)
            {
                hasError = true;
                this.OnDownload("开始", false, "错误:" + ex.Message, true);
            }
            finally
            {
                DateTime end = DateTime.Now;
                Debug.WriteLine("用时:" + (end - start).TotalSeconds + ",共下载:" + goods.Count);
                this.isStop = true;
                this.task   = null;
                if (hasError == false)
                {
                    this.OnDownload("开始", false, "下载完成", true);
                }
            }
        }
예제 #33
0
파일: Worker.cs 프로젝트: S1m0n2669/Test
    void MoveToMine()
    {
        Debug.Log("<color=green>Moving to mine </color>");

        if (targetMine == null || !targetMine.isActive)
        {
            targetMine = FindClosestMine(bannedMineList);

            if (targetMine != null)
            {
                Debug.Log("<color=green>targetMine = " + targetMine + " </color>");
                Direction = (targetMine.Position - Position).normalized;
            }
            else
            {
                currentState = WorkerState.movingToStorage;
            }

            return;
        }

        if (Vector3.Distance(targetMine.Position, Position) < Config.Instance.StopDistance)
        {
            if (targetMine.TryAddWorker())
            {
                currentState = WorkerState.mining;
            }
            else //рабочий не смог подключиться к шахте и пошёл искать следущую
            {
                if (targetMine != null && !bannedMineList.Contains(targetMine))
                {
                    bannedMineList.Add(targetMine);
                }

                targetMine = FindClosestMine(bannedMineList);

                if (targetMine != null)
                {
                    Direction = (targetMine.Position - Position).normalized;
                }
                else
                {
                    currentState = WorkerState.movingToStorage;
                }
            }
        }
        else
        {
            Moving();
        }
    }
        public void begin(long total_samples, WorkerState state)
        {
            is_running_    = true;
            total_samples_ = total_samples;
            int buffer_length = sample_rate_ / 10;

            double[] left  = new double[buffer_length];
            double[] right = new double[buffer_length];

            if (driver_.getUi(null) == null)
            {
                throw new InvalidOperationException("plugin ui を main view のスレッドで作成した後、このメソッドを呼ばなくてはならない。");
            }

            var eventQueue = generateMidiEvent(sequence_, track_index_);

            foreach (var sequence_item in eventQueue.getSequence())
            {
                var clock = sequence_item.Key;
                var queue = sequence_item.Value;

                long to_sample = (long)(sequence_.getSecFromClock(clock) * sample_rate_);
                if (to_sample >= total_samples_)
                {
                    to_sample = total_samples_;
                }
                doSynthesis(to_sample, left, right, state);
                if (position_ >= total_samples_)
                {
                    break;
                }

                // noteOff, noteOn の順に分けて send する方法も考えられるが、正しく動作しない。
                // このため、いったん一つの配列にまとめてから send する必要がある。
                var events = new List <MidiEvent>();
                events.AddRange(queue.pit);
                events.AddRange(queue.noteoff);
                events.AddRange(queue.noteon);
                driver_.send(events.ToArray());

                //TODO: のこりのイベント送る処理
            }

            doSynthesis(total_samples, left, right, state);

            receiver_.end();
            is_running_ = false;
            state.reportComplete();
        }
예제 #35
0
        private async void Work()
        {
            // Get a new request from the queue.
            var request = requestProvider.ProvideRequest();

            if (request != null)
            {
                State = WorkerState.Busy;
                await request.Process();
            }
            else
            {
                State = WorkerState.Idle;
            }
        }
예제 #36
0
        public override WorkerState StateFactory(WorkerState args = null)
        {
            WorkerState state        = null;
            var         currentState = args as MockWorkerState;

            if (null == args)
            {
                state = InitialWork();
            }
            else if (args is ConcreteWorkerStateC && currentState.Success)
            {
                state = new ConcreteWorkerStateD(_logger);
            }
            return(state);
        }
예제 #37
0
파일: Worker.cs 프로젝트: hong1990/ecommon
        /// <summary>Start the worker if it is not running.
        /// </summary>
        public Worker Start()
        {
            if (_currentState != null && !_currentState.StopRequested) return this;

            var thread = new Thread(Loop)
            {
                Name = string.Format("{0}.Worker", _actionName),
                IsBackground = true
            };
            var state = new WorkerState();

            thread.Start(state);

            _currentState = state;
            _logger.DebugFormat("Worker started, actionName:{0}, id:{1}, managedThreadId:{2}, nativeThreadId:{3}", _actionName, state.Id, thread.ManagedThreadId, GetNativeThreadId(thread));

            return this;
        }
        private void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            /* Create an FTP Request */
            FtpWebRequest ftpRequest = (FtpWebRequest)FtpWebRequest.Create(data.adress + "/" + remoteFile);
            /* Log in to the FTP Server with the User Name and Password Provided */
            ftpRequest.Credentials = new NetworkCredential(data.login, data.password);
            /* When in doubt, use these options */
            ftpRequest.UseBinary = true;
            ftpRequest.UsePassive = true;
            ftpRequest.KeepAlive = true;
            /* Specify the Type of FTP Request */
            ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
            /* Establish Return Communication with the FTP Server */
            Stream ftpStream = ftpRequest.GetRequestStream();
            /* Open a File Stream to Read the File for Upload */
            FileStream localFileStream = new FileStream(localFile, FileMode.Open);
            /* Buffer for the Downloaded Data */
            byte[] byteBuffer = new byte[bufferSize];
            int bytesSent = localFileStream.Read(byteBuffer, 0, bufferSize);
            int totalBytesSent = bytesSent;
            /* Upload the File by Sending the Buffered Data Until the Transfer is Complete */
            while (bytesSent != 0)
            {
                ftpStream.Write(byteBuffer, 0, bytesSent);
                bytesSent = localFileStream.Read(byteBuffer, 0, bufferSize);
                totalBytesSent += bytesSent;
                double progress = totalBytesSent * 100.0 / fileSize;
                WorkerState state = new WorkerState(fileSize, totalBytesSent);
                worker.ReportProgress((int)progress, state);
            }

            /* Resource Cleanup */
            localFileStream.Close();
            ftpStream.Close();
            ftpRequest = null;
        }
        void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            WorkerState state = new WorkerState();
            state.ProgressText = "Parsing word document...";

            BackgroundWorker worker = sender as BackgroundWorker;
            worker.ReportProgress(0, state);

            WordDocumentParser wordDocumentParser;
            try
            {
                wordDocumentParser = new WordDocumentParser(Settings.Default.OohSheetLocation);
            }
            catch (FileNotFoundException exception)
            {
                state.ThrownException = exception;
                state.ErrorMessage = "Could not find the word document. File path is: " + exception.FileName + ".";
                worker.ReportProgress(0, state);
                return;
            }

            List<WorkContact> oohSheetContacts = wordDocumentParser.GetContacts();

            try
            {
                _contactManager = GoogleContactsManager.CreateContactsManager();
            }
            catch (InvalidCredentialsException argumentException)
            {
                state.ThrownException = argumentException;
                state.ErrorMessage = "Invalid username and password were provided.";
                worker.ReportProgress(0, state);
                return;
            }
            catch (ArgumentNullException nullArg)
            {
                state.ThrownException = nullArg;

                string groupName = string.Empty;
                string paramName = nullArg.ParamName;
                if (paramName == "WorkGroup")
                {
                    groupName = Settings.Default.GoogleWorkGroupName;
                }
                else
                {
                    groupName = "My Contacts";
                }
                state.ErrorMessage = "There is no group called " + groupName + " in the Google account.";
                worker.ReportProgress(0, state);
                return;
            }

            state.ProgressText = "Comparing Google contacts to the word document...";
            worker.ReportProgress(0, state);

            var comparer = new ContactComparer(oohSheetContacts, _contactManager);
            _actions = comparer.Compare();

            state.ProgressText = "Finished comparing.";
            worker.ReportProgress(0, state);
        }
예제 #40
0
 public WorkerStateChangedMessage(WorkAssignment workAssignment, WorkerState workerState)
 {
     WorkerBadge = workAssignment.WorkerBadge;
     WorkerState = workerState;
 }
예제 #41
0
 /// <summary>
 /// Create the writer and thread
 /// </summary>
 public BackgroundWriter(Stream stream, bool closeStream)
 {
     _flush = new ManualResetEvent(false);
     _flushAsync = s => s.Flush();
     _state = new WorkerState(stream, closeStream);
 }
 private void ShowWorking(string status)
 {
     statusLabel.Text = status;
     this.BackgroundImage = Resources.editpanel_share_element_blue;
     cancelButton.Visible = true;
     statusLabel.Cursor = Cursors.Default;
     iconPicture.Cursor = Cursors.Default;
     workerState = WorkerState.Working;
 }
 private void ShowNotStarted(string status)
 {
     statusLabel.Text = status;
     this.BackgroundImage = Resources.editpanel_share_element;
     cancelButton.Visible = false;
     workerState = WorkerState.Inactive;
 }
 private void ShowError(string status)
 {
     statusLabel.Text = status;
     this.BackgroundImage = Resources.editpanel_share_element_red;
     cancelButton.Visible = false;
     statusLabel.Cursor = Cursors.Hand;
     iconPicture.Cursor = Cursors.Hand;
     workerState = WorkerState.Error;
 }
        private void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            /* Create an FTP Request */
            ftpRequest = (FtpWebRequest)FtpWebRequest.Create(data.adress + "/" + remoteFile);
            /* Log in to the FTP Server with the User Name and Password Provided */
            ftpRequest.Credentials = new NetworkCredential(data.login, data.password);
            /* When in doubt, use these options */
            ftpRequest.UseBinary = true;
            ftpRequest.UsePassive = true;
            ftpRequest.KeepAlive = true;
            /* Specify the Type of FTP Request */
            ftpRequest.Method = WebRequestMethods.Ftp.DownloadFile;
            /* Establish Return Communication with the FTP Server */
            ftpResponse = (FtpWebResponse)ftpRequest.GetResponse();
            /* Get the FTP Server's Response Stream */
            ftpStream = ftpResponse.GetResponseStream();
            /* Open a File Stream to Write the Downloaded File */
            Directory.CreateDirectory(Path.GetDirectoryName(localFile));
            localFileStream = new FileStream(localFile, FileMode.Create);
            /* Buffer for the Downloaded Data */
            byte[] byteBuffer = new byte[bufferSize];
            int bytesRead = ftpStream.Read(byteBuffer, 0, bufferSize);
            int totalBytesRead = bytesRead;
            /* Download the File by Writing the Buffered Data Until the Transfer is Complete */
            while (bytesRead > 0)
            {
                if (cancel)
                {
                    localFileStream.Close();
                    ftpRequest.Abort();
                    ftpStream.Close();
                    ftpResponse.Close();
                    ftpRequest = null;
                    ftpResponse = null;
                    ftpStream = null;
                    localFileStream = null;
                    e.Cancel = true;
                    return;
                }
                localFileStream.Write(byteBuffer, 0, bytesRead);
                bytesRead = ftpStream.Read(byteBuffer, 0, bufferSize);
                totalBytesRead += bytesRead;
                double progress = totalBytesRead * 100.0 / fileSize;
                WorkerState state = new WorkerState(fileSize, totalBytesRead);
                worker.ReportProgress((int)progress, state);
            }

            /* Resource Cleanup */
            localFileStream.Close();
            ftpStream.Close();
            ftpResponse.Close();
            ftpRequest = null;
        }
예제 #46
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="total_samples"></param>
        /// <param name="mode_infinite"></param>
        /// <param name="sample_rate"></param>
        /// <param name="runner">このドライバを駆動しているRenderingRunnerのオブジェクト</param>
        /// <returns></returns>
        public int startRendering( long total_samples, boolean mode_infinite, int sample_rate, IWaveIncoming runner, WorkerState state )
        {
#if DEBUG
            sout.println( "VocaloidDriver#startRendering; entry; total_samples=" + total_samples + "; sample_rate=" + sample_rate );
#endif
            lock ( locker ) {
                rendering = true;
                //g_cancelRequired = false;
                g_progress = 0.0;
                sampleRate = sample_rate;

                Vector<MidiEvent> lpEvents = merge_events( s_track_events.get( 0 ), s_track_events.get( 1 ) );
                int current_count = -1;
                MidiEvent current = new MidiEvent();// = lpEvents;

                MemoryManager mman = null;
                float* left_ch;
                float* right_ch;
                float** out_buffer;
                try {
                    mman = new MemoryManager();
                    left_ch = (float*)mman.malloc( sizeof( float ) * sampleRate ).ToPointer();
                    right_ch = (float*)mman.malloc( sizeof( float ) * sampleRate ).ToPointer();
                    out_buffer = (float**)mman.malloc( sizeof( float* ) * 2 ).ToPointer();
                    out_buffer[0] = left_ch;
                    out_buffer[1] = right_ch;

                    double[] buffer_l = new double[sampleRate];
                    double[] buffer_r = new double[sampleRate];

#if TEST
                    org.kbinani.debug.push_log( "    calling initial dispatch..." );
#endif
#if DEBUG
                    sout.println( "VocaloidDriver#startRendering; sampleRate=" + sampleRate );
#endif
                    aEffect.Dispatch( AEffectOpcodes.effSetSampleRate, 0, 0, IntPtr.Zero, (float)sampleRate );
                    aEffect.Dispatch( AEffectOpcodes.effMainsChanged, 0, 1, IntPtr.Zero, 0 );

                    // ここではブロックサイズ=サンプリングレートということにする
                    aEffect.Dispatch( AEffectOpcodes.effSetBlockSize, 0, sampleRate, IntPtr.Zero, 0 );

                    // レンダリングの途中で停止した場合,ここでProcessする部分が無音でない場合がある
                    for ( int i = 0; i < 3; i++ ) {
                        aEffect.ProcessReplacing( IntPtr.Zero, new IntPtr( out_buffer ), sampleRate );
                    }
#if TEST
                    org.kbinani.debug.push_log( "    ...done" );
#endif

                    int delay = 0;
                    int duration = 0;
                    int dwNow = 0;
                    int dwPrev = 0;
                    int dwDelta;
                    int dwDelay = 0;
                    int dwDeltaDelay = 0;

                    int addr_msb = 0, addr_lsb = 0;
                    int data_msb = 0, data_lsb = 0;

                    int total_processed = 0;
                    int total_processed2 = 0;
#if TEST
                    org.kbinani.debug.push_log( "    getting dwDelay..." );
#endif
                    dwDelay = 0;
                    Vector<MidiEvent> list = s_track_events.get( 1 );
                    int list_size = list.size();
                    for ( int i = 0; i < list_size; i++ ) {
                        MidiEvent work = list.get( i );
                        if ( (work.firstByte & 0xf0) == 0xb0 ) {
                            switch ( work.data[0] ) {
                                case 0x63:
                                addr_msb = work.data[1];
                                addr_lsb = 0;
                                break;
                                case 0x62:
                                addr_lsb = work.data[1];
                                break;
                                case 0x06:
                                data_msb = work.data[1];
                                break;
                                case 0x26:
                                data_lsb = work.data[1];
                                if ( addr_msb == 0x50 && addr_lsb == 0x01 ) {
                                    dwDelay = (data_msb & 0xff) << 7 | (data_lsb & 0x7f);
                                }
                                break;
                            }
                        }
                        if ( dwDelay > 0 ) {
                            break;
                        }
                    }
#if TEST
                    org.kbinani.debug.push_log( "    ...done; dwDelay=" + dwDelay );
#endif

                    while ( !state.isCancelRequested() ) {
                        int process_event_count = current_count;
                        int nEvents = 0;

#if TEST
                        org.kbinani.debug.push_log( "lpEvents.Count=" + lpEvents.size() );
#endif
                        if ( current_count < 0 ) {
                            current_count = 0;
                            current = lpEvents.get( current_count );
                            process_event_count = current_count;
                        }
                        while ( current.clock == dwNow ) {
                            // durationを取得
                            if ( (current.firstByte & 0xf0) == 0xb0 ) {
                                switch ( current.data[0] ) {
                                    case 0x63:
                                    addr_msb = current.data[1];
                                    addr_lsb = 0;
                                    break;
                                    case 0x62:
                                    addr_lsb = current.data[1];
                                    break;
                                    case 0x06:
                                    data_msb = current.data[1];
                                    break;
                                    case 0x26:
                                    data_lsb = current.data[1];
                                    // Note Duration in millisec
                                    if ( addr_msb == 0x50 && addr_lsb == 0x4 ) {
                                        duration = data_msb << 7 | data_lsb;
                                    }
                                    break;
                                }
                            }

                            nEvents++;
                            if ( current_count + 1 < lpEvents.size() ) {
                                current_count++;
                                current = lpEvents.get( current_count );
                            } else {
                                break;
                            }
                        }

                        if ( current_count + 1 >= lpEvents.size() ) {
                            break;
                        }

                        double msNow = msec_from_clock( dwNow );
                        dwDelta = (int)(msNow / 1000.0 * sampleRate) - total_processed;
#if TEST
                    org.kbinani.debug.push_log( "dwNow=" + dwNow );
                    org.kbinani.debug.push_log( "dwPrev=" + dwPrev );
                    org.kbinani.debug.push_log( "dwDelta=" + dwDelta );
#endif
                        VstEvents* pVSTEvents = (VstEvents*)mman.malloc( sizeof( VstEvent ) + nEvents * sizeof( VstEvent* ) ).ToPointer();
                        pVSTEvents->numEvents = 0;
                        pVSTEvents->reserved = (VstIntPtr)0;

                        for ( int i = 0; i < nEvents; i++ ) {
                            MidiEvent pProcessEvent = lpEvents.get( process_event_count );
                            int event_code = pProcessEvent.firstByte;
                            VstEvent* pVSTEvent = (VstEvent*)0;
                            VstMidiEvent* pMidiEvent;

                            switch ( event_code ) {
                                case 0xf0:
                                case 0xf7:
                                case 0xff:
                                break;
                                default:
                                pMidiEvent = (VstMidiEvent*)mman.malloc( (int)(sizeof( VstMidiEvent ) + (pProcessEvent.data.Length + 1) * sizeof( byte )) ).ToPointer();
                                pMidiEvent->byteSize = sizeof( VstMidiEvent );
                                pMidiEvent->deltaFrames = dwDelta;
                                pMidiEvent->detune = 0;
                                pMidiEvent->flags = 1;
                                pMidiEvent->noteLength = 0;
                                pMidiEvent->noteOffset = 0;
                                pMidiEvent->noteOffVelocity = 0;
                                pMidiEvent->reserved1 = 0;
                                pMidiEvent->reserved2 = 0;
                                pMidiEvent->type = VstEventTypes.kVstMidiType;
                                pMidiEvent->midiData[0] = (byte)(0xff & pProcessEvent.firstByte);
                                for ( int j = 0; j < pProcessEvent.data.Length; j++ ) {
                                    pMidiEvent->midiData[j + 1] = (byte)(0xff & pProcessEvent.data[j]);
                                }
                                pVSTEvents->events[pVSTEvents->numEvents++] = (int)(VstEvent*)pMidiEvent;
                                break;
                            }
                            process_event_count++;
                            //pProcessEvent = lpEvents[process_event_count];
                        }
#if TEST
                        org.kbinani.debug.push_log( "calling Dispatch with effProcessEvents..." );
#endif
                        aEffect.Dispatch( AEffectXOpcodes.effProcessEvents, 0, 0, new IntPtr( pVSTEvents ), 0 );
#if TEST
                        org.kbinani.debug.push_log( "...done" );
#endif

                        while ( dwDelta > 0 && !state.isCancelRequested() ) {
                            int dwFrames = dwDelta > sampleRate ? sampleRate : dwDelta;
#if TEST
                            org.kbinani.debug.push_log( "calling ProcessReplacing..." );
#endif
                            aEffect.ProcessReplacing( IntPtr.Zero, new IntPtr( out_buffer ), dwFrames );
#if TEST
                            org.kbinani.debug.push_log( "...done" );
#endif

                            int iOffset = dwDelay - dwDeltaDelay;
                            if ( iOffset > (int)dwFrames ) {
                                iOffset = (int)dwFrames;
                            }

                            if ( iOffset == 0 ) {
                                for ( int i = 0; i < (int)dwFrames; i++ ) {
                                    buffer_l[i] = out_buffer[0][i];
                                    buffer_r[i] = out_buffer[1][i];
                                }
                                total_processed2 += dwFrames;
                                runner.waveIncomingImpl( buffer_l, buffer_r, dwFrames, state );
                            } else {
                                dwDeltaDelay += iOffset;
                            }
                            dwDelta -= dwFrames;
                            total_processed += dwFrames;
                        }

                        dwPrev = dwNow;
                        dwNow = (int)current.clock;
                        g_progress = total_processed / (double)total_samples * 100.0;
                    }

                    double msLast = msec_from_clock( dwNow );
                    dwDelta = (int)(sampleRate * ((double)duration + (double)delay) / 1000.0 + dwDeltaDelay);
                    if ( total_samples - total_processed2 > dwDelta ) {
                        dwDelta = (int)total_samples - total_processed2;
                    }
                    while ( dwDelta > 0 && !state.isCancelRequested() ) {
                        int dwFrames = dwDelta > sampleRate ? sampleRate : dwDelta;
#if TEST
                        org.kbinani.debug.push_log( "calling ProcessReplacing..." );
#endif
                        aEffect.ProcessReplacing( IntPtr.Zero, new IntPtr( out_buffer ), dwFrames );
#if TEST
                        org.kbinani.debug.push_log( "...done" );
#endif

                        for ( int i = 0; i < (int)dwFrames; i++ ) {
                            buffer_l[i] = out_buffer[0][i];
                            buffer_r[i] = out_buffer[1][i];
                        }
                        total_processed2 += dwFrames;
                        runner.waveIncomingImpl( buffer_l, buffer_r, dwFrames, state );

                        dwDelta -= dwFrames;
                        total_processed += dwFrames;
                    }

#if TEST
                    sout.println( "vstidrv::StartRendering; total_processed=" + total_processed );
#endif

                    if ( mode_infinite ) {
                        for ( int i = 0; i < sampleRate; i++ ) {
                            buffer_l[i] = 0.0;
                            buffer_r[i] = 0.0;
                        }
                        while ( !state.isCancelRequested() ) {
                            total_processed2 += sampleRate;
                            runner.waveIncomingImpl( buffer_l, buffer_r, sampleRate, state );
                        }
                    }

                    aEffect.Dispatch( AEffectOpcodes.effMainsChanged, 0, 0, IntPtr.Zero, 0 );
                    lpEvents.clear();
#if DEBUG
                    sout.println( "VocaloidDriver#startRendering; done; total_processed=" + total_processed + "; total_processed2=" + total_processed2 );
#endif
                } catch ( Exception ex ) {
                    serr.println( "VocaloidDriver#startRendering; ex=" + ex );
                } finally {
                    if ( mman != null ) {
                        try {
                            mman.dispose();
                        } catch ( Exception ex2 ) {
                            serr.println( "VocaloidDriver#startRendering; ex2=" + ex2 );
                        }
                    }
                }
                rendering = false;
                g_saProcessed = 0;
                for ( int i = 0; i < s_track_events.size(); i++ ) {
                    s_track_events.get( i ).clear();
                }
                g_tempoList.clear();
                //g_cancelRequired = false;
            }
            return 1;
        }
예제 #47
0
        public void begin( long total_samples, WorkerState state )
        {
            is_running_ = true;
            total_samples_ = total_samples;
            int buffer_length = sample_rate_ / 10;
            double[] left = new double[buffer_length];
            double[] right = new double[buffer_length];

            if ( driver_.getUi( null ) == null ) {
                throw new InvalidOperationException("plugin ui を main view のスレッドで作成した後、このメソッドを呼ばなくてはならない。");
            }

            var eventQueue = generateMidiEvent( sequence_, track_index_ );
            foreach ( var sequence_item in eventQueue.getSequence() ) {
                var clock = sequence_item.Key;
                var queue = sequence_item.Value;

                long to_sample = (long)(sequence_.getSecFromClock( clock ) * sample_rate_);
                if ( to_sample >= total_samples_ ) {
                    to_sample = total_samples_;
                }
                doSynthesis( to_sample, left, right, state );
                if ( position_ >= total_samples_ ) break;

                // noteOff, noteOn の順に分けて send する方法も考えられるが、正しく動作しない。
                // このため、いったん一つの配列にまとめてから send する必要がある。
                var events = new List<MidiEvent>();
                events.AddRange( queue.pit );
                events.AddRange( queue.noteoff );
                events.AddRange( queue.noteon );
                driver_.send( events.ToArray() );

                //TODO: のこりのイベント送る処理
            }

            doSynthesis( total_samples, left, right, state );

            receiver_.end();
            is_running_ = false;
            state.reportComplete();
        }
예제 #48
0
		public void Resume()
		{
			if(this.IsDisposed)
				throw new ObjectDisposedException(_name);

			if(_disabled || (!_canPauseAndContinue))
				return;

			if(_state != WorkerState.Paused)
				return;

			//保存原来的状态
			var originalState = _state;

			//更新当前状态为“正在恢复中”
			_state = WorkerState.Resuming;

			try
			{
				//执行恢复操作
				this.OnResume();

				_state = WorkerState.Running;

				//激发“StateChanged”事件
				this.OnStateChanged(new WorkerStateChangedEventArgs("Resume", WorkerState.Running));
			}
			catch(Exception ex)
			{
				//还原状态
				_state = originalState;

				//激发“StateChanged”事件
				this.OnStateChanged(new WorkerStateChangedEventArgs("Resume", originalState, ex));

				throw;
			}
		}
예제 #49
0
 private void doSynthesis( long to_sample, double[] left, double[] right, WorkerState state )
 {
     int buffer_length = left.Length;
     long remain = to_sample - position_;
     while ( 0 < remain && !state.isCancelRequested() ) {
         int process = buffer_length < remain ? buffer_length : (int)remain;
         Array.Clear( left, 0, process );
         Array.Clear( right, 0, process );
         driver_.process( left, right, process );
         if ( receiver_ != null ) {
             receiver_.push( left, right, process );
         }
         remain -= process;
         position_ += process;
         state.reportProgress( position_ );
     }
 }
예제 #50
0
 public void Resume()
 {
     lock (_lock)
     {
         if (_state == WorkerState.Suspended)
         {
             _requestedState = WorkerState.Running;
             _eventWaiter.Set();
             SpinWait.SpinUntil(() => _requestedState == _state);
         }
         else
         {
             // Probably not needed, added as a precaution.
             throw new InvalidOperationException("The worker is not in suspended state.");
         }
     }
 }
        public void begin( long total_samples, WorkerState state )
        {
            var mDriver = getDriver();
#if DEBUG
            sout.println( "AquesToneRenderingRunner#begin; (mDriver==null)=" + (mDriver == null) );
            String file = System.IO.Path.Combine( System.Windows.Forms.Application.StartupPath, "AquesToneWaveGenerator.txt" );
            log = new System.IO.StreamWriter( file );
            log.AutoFlush = true;
#endif
            if ( mDriver == null ) {
#if DEBUG
                log.WriteLine( "mDriver==null" );
                log.Close();
#endif
                exitBegin();
                state.reportComplete();
                return;
            }

#if DEBUG
            sout.println( "AquesToneRenderingRunner#begin; mDriver.loaded=" + mDriver.loaded );
#endif
            if ( !mDriver.loaded ) {
#if DEBUG
                log.WriteLine( "mDriver.loaded=" + mDriver.loaded );
                log.Close();
#endif
                exitBegin();
                state.reportComplete();
                return;
            }

            mRunning = true;
            //mAbortRequired = false;
            mTotalSamples = total_samples;
#if DEBUG
            sout.println( "AquesToneWaveGenerator#begin; mTotalSamples=" + mTotalSamples );
            log.WriteLine( "mTotalSamples=" + mTotalSamples );
            log.WriteLine( "mTrimRemain=" + mTrimRemain );
#endif

            VsqTrack track = mVsq.Track.get( mTrack );
            int BUFLEN = mSampleRate / 10;
            double[] left = new double[BUFLEN];
            double[] right = new double[BUFLEN];
            long saProcessed = 0;
            int saRemain = 0;
            int lastClock = 0; // 最後に処理されたゲートタイム

            // 最初にダミーの音を鳴らす
            // (最初に入るノイズを回避するためと、前回途中で再生停止した場合に無音から始まるようにするため)
            mDriver.resetAllParameters();
            mDriver.process( left, right, BUFLEN );
            MidiEvent f_noteon = new MidiEvent();
            f_noteon.firstByte = 0x90;
            f_noteon.data = new int[] { 0x40, 0x40 };
            f_noteon.clock = 0;
            mDriver.send( new MidiEvent[] { f_noteon } );
            mDriver.process( left, right, BUFLEN );
            MidiEvent f_noteoff = new MidiEvent();
            f_noteoff.firstByte = 0x80;
            f_noteoff.data = new int[] { 0x40, 0x7F };
            mDriver.send( new MidiEvent[] { f_noteoff } );
            for ( int i = 0; i < 3; i++ ) {
                mDriver.process( left, right, BUFLEN );
            }
#if DEBUG
            log.WriteLine( "pre-process done" );
            log.WriteLine( "-----------------------------------------------------" );
            VsqTrack vsq_track = mVsq.Track.get( mTrack );
            for ( Iterator<VsqEvent> itr = vsq_track.getNoteEventIterator(); itr.hasNext(); ) {
                VsqEvent item = itr.next();
                log.WriteLine( "c" + item.Clock + "; " + item.ID.LyricHandle.L0.Phrase );
            }
#endif

            // レンダリング開始位置での、パラメータの値をセットしておく
            for ( Iterator<VsqEvent> itr = track.getNoteEventIterator(); itr.hasNext(); ) {
                VsqEvent item = itr.next();
#if DEBUG
                sout.println( "AquesToneWaveGenerator#begin; item.Clock=" + item.Clock );
                log.WriteLine( "*********************************************************" );
                log.WriteLine( "item.Clock=" + item.Clock );
#endif
                long saNoteStart = (long)(mVsq.getSecFromClock( item.Clock ) * mSampleRate);
                long saNoteEnd = (long)(mVsq.getSecFromClock( item.Clock + item.ID.getLength() ) * mSampleRate);
#if DEBUG
                log.WriteLine( "saNoteStart=" + saNoteStart + "; saNoteEnd=" + saNoteEnd );
#endif

                EventQueueSequence list = generateMidiEvent( mVsq, mTrack, lastClock, item.Clock + item.ID.getLength() );
                lastClock = item.Clock + item.ID.Length + 1;
                for ( Iterator<Integer> itr2 = list.keyIterator(); itr2.hasNext(); ) {
                    // まず直前までの分を合成
                    Integer clock = itr2.next();
#if DEBUG
                    log.WriteLine( "-------------------------------------------------------" );
                    sout.println( "AquesToneWaveGenerator#begin;     clock=" + clock );
#endif
                    long saStart = (long)(mVsq.getSecFromClock( clock ) * mSampleRate);
                    saRemain = (int)(saStart - saProcessed);
#if DEBUG
                    log.WriteLine( "saStart=" + saStart );
                    log.WriteLine( "saRemain=" + saRemain );
#endif
                    while ( saRemain > 0 ) {
                        if ( state.isCancelRequested() ) {
                            goto heaven;
                        }
                        int len = saRemain > BUFLEN ? BUFLEN : saRemain;
                        mDriver.process( left, right, len );
                        waveIncoming( left, right, len );
                        saRemain -= len;
                        saProcessed += len;
                        state.reportProgress( saProcessed );
                        //mTotalAppend += len; <- waveIncomingで計算されるので
                    }

                    // MIDiイベントを送信
                    MidiEventQueue queue = list.get( clock );
                    // まずnoteoff
                    boolean noteoff_send = false;
                    if ( queue.noteoff.size() > 0 ) {
#if DEBUG
                        for ( int i = 0; i < queue.noteoff.size(); i++ ) {
                            String str = "";
                            MidiEvent itemi = queue.noteoff.get( i );
                            str += "0x" + PortUtil.toHexString( itemi.firstByte, 2 ) + " ";
                            for ( int j = 0; j < itemi.data.Length; j++ ) {
                                str += "0x" + PortUtil.toHexString( itemi.data[j], 2 ) + " ";
                            }
                            sout.println( typeof( AquesToneWaveGenerator ) + "#begin;         noteoff; " + str );
                        }
#endif
                        mDriver.send( queue.noteoff.toArray( new MidiEvent[] { } ) );
                        noteoff_send = true;
                    }
                    // parameterの変更
                    if ( queue.param.size() > 0 ) {
                        for ( Iterator<ParameterEvent> itr3 = queue.param.iterator(); itr3.hasNext(); ) {
                            ParameterEvent pe = itr3.next();
#if DEBUG
                            sout.println( typeof( AquesToneWaveGenerator ) + "#begin;         param;   index=" + pe.index + "; value=" + pe.value );
#endif
                            mDriver.setParameter( pe.index, pe.value );
                        }
                    }
                    // ついでnoteon
                    if ( queue.noteon.size() > 0 ) {
                        // 同ゲートタイムにピッチベンドも指定されている場合、同時に送信しないと反映されないようだ!
                        if ( queue.pit.size() > 0 ) {
                            queue.noteon.addAll( queue.pit );
                            queue.pit.clear();
                        }
#if DEBUG
                        for ( int i = 0; i < queue.noteon.size(); i++ ) {
                            String str = "";
                            MidiEvent itemi = queue.noteon.get( i );
                            str += "0x" + PortUtil.toHexString( itemi.firstByte, 2 ) + " ";
                            for ( int j = 0; j < itemi.data.Length; j++ ) {
                                str += "0x" + PortUtil.toHexString( itemi.data[j], 2 ) + " ";
                            }
                            sout.println( typeof( AquesToneWaveGenerator ) + "#begin;         noteon;  " + str );
                        }
#endif
                        mDriver.send( queue.noteon.toArray( new MidiEvent[] { } ) );
                    }
                    // PIT
                    if ( queue.pit.size() > 0 && !noteoff_send ) {
#if DEBUG
                        for ( int i = 0; i < queue.pit.size(); i++ ) {
                            String str = "";
                            MidiEvent itemi = queue.pit.get( i );
                            str += "0x" + PortUtil.toHexString( itemi.firstByte, 2 ) + " ";
                            for ( int j = 0; j < itemi.data.Length; j++ ) {
                                str += "0x" + PortUtil.toHexString( itemi.data[j], 2 ) + " ";
                            }
                            sout.println( typeof( AquesToneWaveGenerator ) + "#begin;         pit;     " + str );
                        }
#endif
                        mDriver.send( queue.pit.toArray( new MidiEvent[] { } ) );
                    }
                    if ( mDriver.getUi( mMainWindow ) != null ) {
                        mDriver.getUi( mMainWindow ).invalidateUi();
                    }
                }
            }

            // totalSamplesに足りなかったら、追加してレンダリング
            saRemain = (int)(mTotalSamples - mTotalAppend);
#if DEBUG
            sout.println( "AquesToneRenderingRunner#run; totalSamples=" + mTotalSamples + "; mTotalAppend=" + mTotalAppend + "; saRemain=" + saRemain );
#endif
            while ( saRemain > 0 ) {
                if ( state.isCancelRequested() ) {
                    goto heaven;
                }
                int len = saRemain > BUFLEN ? BUFLEN : saRemain;
                mDriver.process( left, right, len );
                waveIncoming( left, right, len );
                saRemain -= len;
                saProcessed += len;
                state.reportProgress( saProcessed );
                //mTotalAppend += len;
            }
        heaven:
#if DEBUG
            log.Close();
#endif
            exitBegin();
            state.reportComplete();
        }
        private void CreateEvents_OnClick(object sender, RoutedEventArgs e)
        {
            //Open the specified file and get the contents
            try
            {
                var file = new FileInfo(ImportFilePath.Text);

                if (file.Extension == ".csv")
                {
                    using (var fs = File.OpenRead(ImportFilePath.Text))
                    {
                        using (var reader = new StreamReader(fs))
                        {
                            _Data = reader.ReadToEnd();
                        }
                    }
                }
                else if (file.Extension == ".xlsx")
                {
                    XSSFWorkbook workbook;

                    using (var fs = File.OpenRead(ImportFilePath.Text))
                    {
                        workbook = new XSSFWorkbook(fs);
                    }

                    var sheet = workbook.GetSheetAt(0);
                    var tempData = "";

                    //Assume that the first row has the names of the columns
                    for (int i = 1; i <= sheet.LastRowNum; i++)
                    {
                        if (sheet.GetRow(i) != null)
                        {
                            var row = sheet.GetRow(i);
                            var rowString = "";

                            for (int j = 0; j < row.LastCellNum; j++)
                            {
                                string cellData = "";

                                if (row.Cells.Count < 2) continue; //this is how we avoid empty rows.
                                if (j > 1) continue; //this will ignore any other columns in the row except the first two columns...

                                var cell = row.Cells[j];

                                //This is the data type for date? Oh well...
                                if (cell.CellType == CellType.NUMERIC)
                                {
                                    var dateTime = cell.DateCellValue;
                                    cellData = dateTime.ToString("yyyy-MM-ddTHH:mm:ss-0500");
                                }
                                else
                                    cellData = row.Cells[j].StringCellValue;

                                rowString += (rowString == "") ? cellData : "," + cellData;
                            }

                            rowString += Environment.NewLine;
                            tempData += rowString;
                        }
                    }

                    _Data = tempData;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("I tried reading the contents of the file and I couldn't. Do you have it open?", "Doh!", MessageBoxButton.OK,
                                MessageBoxImage.Error);
                Logger.LogInfo(ex.Message + Environment.NewLine + ex.StackTrace);
                return;
            }

            if (_Data == "")
            {
                MessageBox.Show("I can't create events out of nothing! The contents of the specified file appear to be blank.", "Doh!", MessageBoxButton.OK,
                                MessageBoxImage.Exclamation);
                return;
            }

            var events = _Data.Split(new string[] { "\n", "\r\n" }, StringSplitOptions.RemoveEmptyEntries);

            //Clear the old event links..
            ResultLinks.Children.Clear();

            Progress.Maximum = events.Length;
            Progress.Value = 0;

            var worker = new BackgroundWorker();
            worker.WorkerSupportsCancellation = true;
            worker.WorkerReportsProgress = true;
            worker.DoWork += (o, wArgs) =>
                {
                    var thisWorker = o as BackgroundWorker;

                    foreach (var item in events)
                    {
                        //split by commas
                        var csvValues = item.Split(',');
                        var name = csvValues[0];
                        var date = csvValues[1];

                        var fb = new FacebookClient();
                        var parameters = new Dictionary<string, object>();
                        parameters.Add("access_token", _PageAccessToken);
                        parameters.Add("name", name);
                        parameters.Add("start_time", date);
                        var postUrl = string.Format("/{0}/events", _PageId);
                        var state = new WorkerState();

                        try
                        {
                            var json = fb.Post(postUrl, parameters).ToString();
                            var root = JObject.Parse(json);
                            var eventId = root["id"];
                            state.Error = false;
                            state.Name = name;
                            state.Id = eventId.ToString();

                            thisWorker.ReportProgress(1, state);
                        }
                        catch (Exception ex)
                        {
                            state.Error = true;
                            state.Name = string.Format("Error creating event '{0}' --> ", name) + ex.Message;

                            thisWorker.ReportProgress(1, state);
                            Logger.LogInfo(ex.Message + Environment.NewLine + ex.StackTrace);
                        }
                    }
                };

            worker.ProgressChanged += (s, wArgs) =>
                {
                    Progress.Value += 1;

                    var state = wArgs.UserState as WorkerState;

                    if (state.Error)
                    {
                        var errorLabel = new Label();
                        errorLabel.Margin = new Thickness(0, 2, 0, 2);
                        errorLabel.Content = state.Name;
                        ResultLinks.Children.Add(errorLabel);
                    }
                    else
                    {
                        var linkButton = new Button();
                        linkButton.Margin = new Thickness(0, 2, 0, 2);
                        linkButton.Content = string.Format("Open event '{0}'", state.Name);
                        linkButton.HorizontalAlignment = HorizontalAlignment.Left;
                        linkButton.Click += (snd, args) =>
                        {
                            var eventUrl = string.Format("https://www.facebook.com/events/{0}/", state.Id);

                            //Open a browser window with the event URL
                            System.Diagnostics.Process.Start(eventUrl);
                        };
                        ResultLinks.Children.Add(linkButton);
                    }
                };

            worker.RunWorkerCompleted += (s, wArgs) =>
                {
                    Loading.Visibility = Visibility.Collapsed;
                    NewLinks.Visibility = Visibility.Visible;
                    ImportFilePath.Text = string.Empty;
                };

            Loading.Visibility = Visibility.Visible;
            NewLinks.Visibility = Visibility.Collapsed;

            worker.RunWorkerAsync();
        }
		public WorkerStateChangedEventArgs(string actionName, WorkerState state) : this(actionName, state, null)
		{
		}
예제 #54
0
		public void Start(params string[] args)
		{
			if(this.IsDisposed)
				throw new ObjectDisposedException(_name);

			if(_disabled || _state != WorkerState.Stopped)
				return;

			//更新当前状态为“整体启动中”
			_state = WorkerState.Starting;

			try
			{
				//调用启动抽象方法,以执行实际的启动操作
				this.OnStart(args);

				//更新当前状态为“运行中”
				_state = WorkerState.Running;

				//激发“StateChanged”事件
				this.OnStateChanged(new WorkerStateChangedEventArgs("Start", WorkerState.Running));
			}
			catch(Exception ex)
			{
				_state = WorkerState.Stopped;

				//激发“StateChanged”事件
				this.OnStateChanged(new WorkerStateChangedEventArgs("Start", WorkerState.Stopped, ex));

				throw;
			}
		}
예제 #55
0
		public void Stop(params string[] args)
		{
			if(this.IsDisposed)
				throw new ObjectDisposedException(_name);

			if(_disabled || _state == WorkerState.Stopping || _state == WorkerState.Stopped)
				return;

			//保存原来的状态
			var originalState = _state;

			//更新当前状态为“正在停止中”
			_state = WorkerState.Stopping;

			try
			{
				//调用停止抽象方法,以执行实际的停止操作
				this.OnStop(args);

				//更新当前状态为已停止
				_state = WorkerState.Stopped;

				//激发“StateChanged”事件
				this.OnStateChanged(new WorkerStateChangedEventArgs("Stop", WorkerState.Stopped));
			}
			catch(Exception ex)
			{
				//还原状态
				_state = originalState;

				//激发“StateChanged”事件
				this.OnStateChanged(new WorkerStateChangedEventArgs("Stop", originalState, ex));

				throw;
			}
		}
예제 #56
0
        public void Stop()
        {
            lock (_lock)
            {
                if (_state == WorkerState.Running || _state == WorkerState.Suspended)
                {
                    _requestedState = WorkerState.Stopped;

                    // Prevent deadlock by checking is we stopping from worker task or not.
                    if (Thread.CurrentThread.ManagedThreadId != _workerTask.ManagedThreadId)
                    {
                        _eventWaiter.Set();
                        _workerTask.Join();
                    }
                }
                else if (!_isFaulted)
                {
                    // Probably not needed, added as a precaution.
                    throw new InvalidOperationException("The worker is already stopped.");
                }
            }
        }
예제 #57
0
 protected virtual void HandleState(WorkerState workerState)
 {
 }