protected WorkerBase() { _name = this.GetType().Name; _disabled = false; _canPauseAndContinue = false; _state = WorkerState.Stopped; }
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; }
protected WorkerBase(string name) { if(string.IsNullOrWhiteSpace(name)) throw new ArgumentNullException("name"); _name = name.Trim(); _disabled = false; _canPauseAndContinue = false; _state = WorkerState.Stopped; }
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); } }
public TransitionBundle ChangeState(WorkerStateTrigger trigger, WorkerState currentState) { foreach (TransitionBundle bundle in workerTransitionsDic[trigger]) { if (bundle.Source == currentState) { return(bundle); } } return(new TransitionBundle(currentState, currentState)); }
protected void OnStateChange(object source, WorkerState state) { StateChangeHandlerEventArgs args = new StateChangeHandlerEventArgs(); args.State = state; if (StateChange != null) { StateChange.Invoke(source, args); } }
private void Idle() { UpdateWorkerStatusCounter(); if (connection.WorkerShouldRun()) { Trace.WriteLine("Switching worker to Loading"); currentState = WorkerState.LOADING; workerStatusCounter = 0; visitedUrls.Clear(); } }
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); } }
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; }
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); }
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."); } } }
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(); }
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); }
private void OnTriggerExit(Collider other) { if (other.gameObject.tag == "Tiles") { state = WorkerState.Seeking; print("state SEEK"); } if (other.gameObject.tag == "Enemy") { } }
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; }
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); } }
protected WorkerBase(string name) { if (string.IsNullOrWhiteSpace(name)) { throw new ArgumentNullException("name"); } _name = name.Trim(); _disabled = false; _canPauseAndContinue = false; _state = WorkerState.Stopped; }
/// <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(); }
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"); } }
/// <summary> /// 建造结束 /// </summary> public void BuildFinish() { _buildTargeter = null; if (_state == WorkerState.Working) { // 设置下班状态 _state = WorkerState.FinishWork; // 移动回工人小屋 DoActionMove(GetDoorOfTheWorkerHouse()); } }
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 } }
public void EnableWorker(bool enable) { GetComponent <BoxCollider>().enabled = enable; if (enable) { state = WorkerState.Movable; } else { state = WorkerState.Immovable; } }
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); }
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; }
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); } }
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(); }
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(); }
public SubscriptionState( string name, bool isStarted, bool isStartable, QueueState[] queueStates, WorkerState[] workerStates) { Name = name; IsStarted = isStarted; IsStartable = isStartable; QueueStates = queueStates; Workers = workerStates; }
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); } } }
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(); }
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; } }
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); }
/// <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); }
public WorkerStateChangedMessage(WorkAssignment workAssignment, WorkerState workerState) { WorkerBadge = workAssignment.WorkerBadge; WorkerState = workerState; }
/// <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; }
/// <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; }
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(); }
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; } }
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_ ); } }
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) { }
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; } }
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; } }
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."); } } }
protected virtual void HandleState(WorkerState workerState) { }