private void RunNESBackGroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { while (PlayLoop && !e.Cancel) { bitmapData = NESBMP.LockBits(new Rectangle(0, 0, 256, 240), ImageLockMode.WriteOnly, NESBMP.PixelFormat); Iptr = bitmapData.Scan0; Marshal.Copy(Iptr, PPU.Pixels, 0, 245760); while (!DrawFrame && PlayLoop) { if (Trace && (CPU.CycleNumber == 0)) { Debugger.GetTracedata(); } CPU.RunCPU(); APU.RunAPU(1); PPU.RunPPU(1); } Marshal.Copy(PPU.Pixels, 0, Iptr, 245760); try { if (bitmapData != null) { NESBMP.UnlockBits(bitmapData); RunNESBackGroundWorker.ReportProgress(0); } } finally { DrawFrame = false; } } }
protected override void OnFormClosing(FormClosingEventArgs e) { if (RunNESBackGroundWorker.IsBusy) { closePending = true; RunNESBackGroundWorker.WorkerSupportsCancellation = true; RunNESBackGroundWorker.CancelAsync(); e.Cancel = true; this.Enabled = false; return; } base.OnFormClosing(e); }