Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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();
        }