private void StartZx_Click(object sender, EventArgs e) { if (runZx48) { runZx48 = false; while (myThread.IsAlive) { } ; return; } zx48 = new Zx48Machine(); zx48.BorderEvent += new BorderEventHandler(BorderChange); zx48.VideoEvent += new VideoEventHandler(VideoChange); zx48.KeybEvent += new KeyboardEventHandler(KeyboardChange); runZx48 = true; myThread = new Thread(new ParameterizedThreadStart(this.StartZX)); myThread.Priority = ThreadPriority.Highest; myThread.IsBackground = false; myThread.Start(zx48); }
public void StartZX(object obj) { Zx48Machine zx48 = (Zx48Machine)obj; zx48.Reset(); Stopwatch swRedraw = new Stopwatch(); Stopwatch swInterrupt = new Stopwatch(); Stopwatch swSecond = new Stopwatch(); swRedraw.Restart(); swInterrupt.Restart(); swSecond.Restart(); double milliseconds; double microseconds; double nanoseconds; long elapsedTicks = 0; long elapsedTicksStart = 0; long execTicks = 0; long execTicksStart = 0; int runCount = 0; int execCount = 0; while (runZx48) { execCount++; execTicksStart = swInterrupt.ElapsedTicks; zx48.Execute(); execTicks += (swInterrupt.ElapsedTicks - execTicksStart); if (swRedraw.ElapsedMilliseconds > 20) { swRedraw.Restart(); runCount++; elapsedTicksStart = swInterrupt.ElapsedTicks; zx48.SendVideoEvent(); elapsedTicks += (swInterrupt.ElapsedTicks - elapsedTicksStart); } if (swInterrupt.ElapsedMilliseconds > 20) //50 раз в секунду { zx48.Interrupt = true; swInterrupt.Restart(); } if (swSecond.ElapsedMilliseconds > 1000) { swSecond.Restart(); elapsedTicks /= runCount; milliseconds = (elapsedTicks * 1000) / Stopwatch.Frequency; microseconds = (elapsedTicks * 1000000) / Stopwatch.Frequency; nanoseconds = (elapsedTicks * 1000000000) / Stopwatch.Frequency; Console.WriteLine($"Redraw {milliseconds} ms - {microseconds} mks - { nanoseconds} ns - Count = {runCount}"); runCount = 0; elapsedTicks = 0; double db = (double)execTicks / (double)execCount; milliseconds = (long)((db * 1000) / Stopwatch.Frequency); microseconds = (long)((db * 1000000) / Stopwatch.Frequency); nanoseconds = (long)((db * 1000000000) / Stopwatch.Frequency); Console.WriteLine($"Execute {milliseconds} ms - {microseconds} mks - { nanoseconds} ns - Count = {execCount}"); execCount = 0; execTicks = 0; } } swSecond.Stop(); swRedraw.Stop(); swInterrupt.Stop(); }