diff options
| author | william341 <[email protected]> | 2017-06-19 12:16:31 -0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2017-06-19 12:16:31 -0700 |
| commit | 09e2268bc220b299ef2c1b8779c4df0b5ef4df3c (patch) | |
| tree | 4ebdeea150ea168678d6b08c8d1d20d246ee6ac2 /ShiftOS.WinForms/Applications | |
| parent | c22370d643008e55121c0ddeaca0b81d755573ff (diff) | |
| parent | df37f3c366fe5884b17fa0b66d154536f8df93d2 (diff) | |
| download | shiftos_thereturn-09e2268bc220b299ef2c1b8779c4df0b5ef4df3c.tar.gz shiftos_thereturn-09e2268bc220b299ef2c1b8779c4df0b5ef4df3c.tar.bz2 shiftos_thereturn-09e2268bc220b299ef2c1b8779c4df0b5ef4df3c.zip | |
Merge pull request #4 from shiftos-game/master
pulling
Diffstat (limited to 'ShiftOS.WinForms/Applications')
| -rw-r--r-- | ShiftOS.WinForms/Applications/MindBlow.Designer.cs | 153 | ||||
| -rw-r--r-- | ShiftOS.WinForms/Applications/MindBlow.cs | 121 |
2 files changed, 194 insertions, 80 deletions
diff --git a/ShiftOS.WinForms/Applications/MindBlow.Designer.cs b/ShiftOS.WinForms/Applications/MindBlow.Designer.cs index da269f6..6a8474d 100644 --- a/ShiftOS.WinForms/Applications/MindBlow.Designer.cs +++ b/ShiftOS.WinForms/Applications/MindBlow.Designer.cs @@ -30,16 +30,18 @@ { this.tabs = new System.Windows.Forms.TabControl(); this.console = new System.Windows.Forms.TabPage(); - this.program = new System.Windows.Forms.TabPage(); - this.monitor = new System.Windows.Forms.TabPage(); this.consoleout = new System.Windows.Forms.TextBox(); - this.programinput = new System.Windows.Forms.TextBox(); - this.load = new System.Windows.Forms.Button(); + this.program = new System.Windows.Forms.TabPage(); + this.stop = new System.Windows.Forms.Button(); + this.run = new System.Windows.Forms.Button(); this.save = new System.Windows.Forms.Button(); - this.memptr = new System.Windows.Forms.Label(); - this.instptr = new System.Windows.Forms.Label(); + this.load = new System.Windows.Forms.Button(); + this.programinput = new System.Windows.Forms.TextBox(); + this.monitor = new System.Windows.Forms.TabPage(); + this.reset = new System.Windows.Forms.Button(); this.memlist = new System.Windows.Forms.ListBox(); - this.run = new System.Windows.Forms.Button(); + this.instptr = new System.Windows.Forms.Label(); + this.memptr = new System.Windows.Forms.Label(); this.tabs.SuspendLayout(); this.console.SuspendLayout(); this.program.SuspendLayout(); @@ -70,8 +72,20 @@ this.console.Text = "Console"; this.console.UseVisualStyleBackColor = true; // + // consoleout + // + this.consoleout.Dock = System.Windows.Forms.DockStyle.Fill; + this.consoleout.Location = new System.Drawing.Point(3, 3); + this.consoleout.Multiline = true; + this.consoleout.Name = "consoleout"; + this.consoleout.ReadOnly = true; + this.consoleout.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.consoleout.Size = new System.Drawing.Size(378, 237); + this.consoleout.TabIndex = 0; + // // program // + this.program.Controls.Add(this.stop); this.program.Controls.Add(this.run); this.program.Controls.Add(this.save); this.program.Controls.Add(this.load); @@ -84,73 +98,78 @@ this.program.Text = "Program"; this.program.UseVisualStyleBackColor = true; // - // monitor + // stop // - this.monitor.Controls.Add(this.memlist); - this.monitor.Controls.Add(this.instptr); - this.monitor.Controls.Add(this.memptr); - this.monitor.Location = new System.Drawing.Point(4, 22); - this.monitor.Name = "monitor"; - this.monitor.Size = new System.Drawing.Size(384, 243); - this.monitor.TabIndex = 2; - this.monitor.Text = "Monitor"; - this.monitor.UseVisualStyleBackColor = true; + this.stop.Location = new System.Drawing.Point(303, 217); + this.stop.Name = "stop"; + this.stop.Size = new System.Drawing.Size(75, 23); + this.stop.TabIndex = 4; + this.stop.Text = "Stop"; + this.stop.UseVisualStyleBackColor = true; + this.stop.Click += new System.EventHandler(this.stop_Click); // - // consoleout + // run // - this.consoleout.Dock = System.Windows.Forms.DockStyle.Fill; - this.consoleout.Location = new System.Drawing.Point(3, 3); - this.consoleout.Multiline = true; - this.consoleout.Name = "consoleout"; - this.consoleout.ReadOnly = true; - this.consoleout.Size = new System.Drawing.Size(378, 237); - this.consoleout.TabIndex = 0; + this.run.Location = new System.Drawing.Point(196, 217); + this.run.Name = "run"; + this.run.Size = new System.Drawing.Size(101, 23); + this.run.TabIndex = 3; + this.run.Text = "Run"; + this.run.UseVisualStyleBackColor = true; + this.run.Click += new System.EventHandler(this.run_Click); // - // programinput + // save // - this.programinput.Location = new System.Drawing.Point(3, 0); - this.programinput.Multiline = true; - this.programinput.Name = "programinput"; - this.programinput.Size = new System.Drawing.Size(378, 218); - this.programinput.TabIndex = 0; + this.save.Location = new System.Drawing.Point(102, 217); + this.save.Name = "save"; + this.save.Size = new System.Drawing.Size(88, 23); + this.save.TabIndex = 2; + this.save.Text = "Save"; + this.save.UseVisualStyleBackColor = true; + this.save.Click += new System.EventHandler(this.save_Click); // // load // this.load.Location = new System.Drawing.Point(6, 217); this.load.Name = "load"; - this.load.Size = new System.Drawing.Size(115, 23); + this.load.Size = new System.Drawing.Size(90, 23); this.load.TabIndex = 1; this.load.Text = "Load"; this.load.UseVisualStyleBackColor = true; this.load.Click += new System.EventHandler(this.load_Click); // - // save + // programinput // - this.save.Location = new System.Drawing.Point(127, 217); - this.save.Name = "save"; - this.save.Size = new System.Drawing.Size(114, 23); - this.save.TabIndex = 2; - this.save.Text = "Save"; - this.save.UseVisualStyleBackColor = true; - this.save.Click += new System.EventHandler(this.save_Click); + this.programinput.Location = new System.Drawing.Point(3, 0); + this.programinput.Multiline = true; + this.programinput.Name = "programinput"; + this.programinput.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.programinput.Size = new System.Drawing.Size(378, 218); + this.programinput.TabIndex = 0; // - // memptr + // monitor // - this.memptr.AutoSize = true; - this.memptr.Location = new System.Drawing.Point(8, 8); - this.memptr.Name = "memptr"; - this.memptr.Size = new System.Drawing.Size(56, 13); - this.memptr.TabIndex = 0; - this.memptr.Text = "Memory: 0"; + this.monitor.Controls.Add(this.reset); + this.monitor.Controls.Add(this.memlist); + this.monitor.Controls.Add(this.instptr); + this.monitor.Controls.Add(this.memptr); + this.monitor.Location = new System.Drawing.Point(4, 22); + this.monitor.Name = "monitor"; + this.monitor.Size = new System.Drawing.Size(384, 243); + this.monitor.TabIndex = 2; + this.monitor.Text = "Monitor"; + this.monitor.UseVisualStyleBackColor = true; // - // instptr + // reset // - this.instptr.AutoSize = true; - this.instptr.Location = new System.Drawing.Point(8, 21); - this.instptr.Name = "instptr"; - this.instptr.Size = new System.Drawing.Size(68, 13); - this.instptr.TabIndex = 1; - this.instptr.Text = "Instruction: 0"; + this.reset.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.reset.Location = new System.Drawing.Point(306, 8); + this.reset.Name = "reset"; + this.reset.Size = new System.Drawing.Size(75, 23); + this.reset.TabIndex = 3; + this.reset.Text = "Reset"; + this.reset.UseVisualStyleBackColor = true; + this.reset.Click += new System.EventHandler(this.reset_Click); // // memlist // @@ -162,15 +181,23 @@ this.memlist.Size = new System.Drawing.Size(370, 199); this.memlist.TabIndex = 2; // - // run + // instptr // - this.run.Location = new System.Drawing.Point(247, 217); - this.run.Name = "run"; - this.run.Size = new System.Drawing.Size(131, 23); - this.run.TabIndex = 3; - this.run.Text = "Run"; - this.run.UseVisualStyleBackColor = true; - this.run.Click += new System.EventHandler(this.run_Click); + this.instptr.AutoSize = true; + this.instptr.Location = new System.Drawing.Point(8, 21); + this.instptr.Name = "instptr"; + this.instptr.Size = new System.Drawing.Size(68, 13); + this.instptr.TabIndex = 1; + this.instptr.Text = "Instruction: 0"; + // + // memptr + // + this.memptr.AutoSize = true; + this.memptr.Location = new System.Drawing.Point(8, 8); + this.memptr.Name = "memptr"; + this.memptr.Size = new System.Drawing.Size(56, 13); + this.memptr.TabIndex = 0; + this.memptr.Text = "Memory: 0"; // // MindBlow // @@ -205,5 +232,7 @@ private System.Windows.Forms.Label memptr; private System.Windows.Forms.ListBox memlist; private System.Windows.Forms.Button run; + private System.Windows.Forms.Button stop; + private System.Windows.Forms.Button reset; } } diff --git a/ShiftOS.WinForms/Applications/MindBlow.cs b/ShiftOS.WinForms/Applications/MindBlow.cs index 6cfaea7..54167da 100644 --- a/ShiftOS.WinForms/Applications/MindBlow.cs +++ b/ShiftOS.WinForms/Applications/MindBlow.cs @@ -10,6 +10,8 @@ using System.Windows.Forms; using ShiftOS.Engine; using System.IO; using System.Threading; +using System.Collections; +using System.Collections.Concurrent; namespace ShiftOS.WinForms.Applications { @@ -18,10 +20,17 @@ namespace ShiftOS.WinForms.Applications [RequiresUpgrade("mindblow")] public partial class MindBlow : UserControl, IShiftOSWindow, IBFListener { + private bool running = true; + private Action updateMemPtr = null, updateIPtr = null; + private Action[] updateMem = new Action[30000]; + private AutoResetEvent evwaiting = new AutoResetEvent(false); + private object evlock = new object(); + private class TextBoxStream : Stream { private TextBox box; private KeysConverter kc; + public KeyPressEventHandler handler; public TextBoxStream(TextBox mybox) { kc = new KeysConverter(); @@ -53,23 +62,20 @@ namespace ShiftOS.WinForms.Applications public override int Read(byte[] buffer, int offset, int count) { - object lck = new object(); int ptr = offset; - KeyPressEventHandler handler = (o, a) => + var hnd = new AutoResetEvent(false); + handler = (o, a) => { - lock (lck) + if (ptr < offset + count) { buffer[ptr] = (byte)a.KeyChar; ptr++; } + if (ptr >= offset + count) + hnd.Set(); }; Desktop.InvokeOnWorkerThread(() => box.KeyPress += handler); - while (true) - { - lock (lck) - if (ptr >= offset + count) - break; - } + hnd.WaitOne(); Desktop.InvokeOnWorkerThread(() => box.KeyPress -= handler); return count; } @@ -94,7 +100,8 @@ namespace ShiftOS.WinForms.Applications } private static string[] DefaultMem; private BFInterpreter Interpreter; - + private Thread InterpreterThread; + private TextBoxStream consolestr; private void DoLayout() { memlist.Left = 0; @@ -104,9 +111,11 @@ namespace ShiftOS.WinForms.Applications program.Left = 0; programinput.Width = program.Width; programinput.Height = program.Height - load.Height; - load.Top = save.Top = run.Top = programinput.Height; - load.Width = save.Width = run.Width = save.Left = program.Width / 3; + load.Top = save.Top = run.Top = stop.Top = programinput.Height; + load.Width = save.Width = run.Width = stop.Width = save.Left = program.Width / 4; + load.Left = 0; run.Left = save.Left * 2; + stop.Left = save.Left * 3; } public MindBlow() @@ -116,17 +125,29 @@ namespace ShiftOS.WinForms.Applications for (ushort i = 0; i < 30000; i++) DefaultMem[i] = "0"; memlist.Items.AddRange(DefaultMem); - Interpreter = new BFInterpreter(new TextBoxStream(consoleout), this); + consolestr = new TextBoxStream(consoleout); + Interpreter = new BFInterpreter(consolestr, this); } public void IPtrMoved(int newval) { - Desktop.InvokeOnWorkerThread(() => instptr.Text = "Instruction: " + newval.ToString()); + lock (evlock) + { + updateIPtr = () => instptr.Text = "Instruction: " + newval.ToString(); + evwaiting.Set(); + } } public void MemChanged(ushort pos, byte newval) { - Desktop.InvokeOnWorkerThread(() => memlist.Items[pos] = newval.ToString()); + lock (evlock) + { + updateMem[pos] = () => + { + memlist.Items[pos] = newval.ToString(); + }; + evwaiting.Set(); + } } public void MemReset() @@ -141,6 +162,36 @@ namespace ShiftOS.WinForms.Applications public void OnLoad() { DoLayout(); + new Thread(() => + { + while (running) + { + evwaiting.WaitOne(); + try + { + lock (evlock) + { + if (updateIPtr != null) + { + Desktop.InvokeOnWorkerThread(updateIPtr); + updateIPtr = null; + } + if (updateMemPtr != null) + { + Desktop.InvokeOnWorkerThread(updateMemPtr); + updateMemPtr = null; + } + for (int i = 0; i < updateMem.Length; i++) + if (updateMem[i] != null) + { + Desktop.InvokeOnWorkerThread(updateMem[i]); + updateMem[i] = null; + } + } + } catch { } + evwaiting.Reset(); + } + }).Start(); } public void OnSkinLoad() @@ -149,6 +200,9 @@ namespace ShiftOS.WinForms.Applications public bool OnUnload() { + running = false; + evwaiting.Set(); // allow the display loop to die of old age + KillThread(); // mercilessly slaughter the interpreter thread return true; } @@ -158,7 +212,11 @@ namespace ShiftOS.WinForms.Applications public void PointerMoved(ushort newval) { - Desktop.InvokeOnWorkerThread(() => memptr.Text = "Memory: " + newval.ToString()); + lock (evlock) + { + updateMemPtr = () => memptr.Text = "Memory: " + newval.ToString(); + evwaiting.Set(); + } } private void MindBlow_Resize(object sender, EventArgs e) @@ -168,18 +226,20 @@ namespace ShiftOS.WinForms.Applications private void run_Click(object sender, EventArgs e) { - new Thread(() => + InterpreterThread = new Thread(() => { try { Interpreter.Reset(); Interpreter.Execute(programinput.Text); } + catch (ThreadAbortException) { } // ignore catch (Exception ex) { Desktop.InvokeOnWorkerThread(() => Infobox.Show("Program Error", "An error occurred while executing your program: " + ex.GetType().ToString())); } - }).Start(); + }); + InterpreterThread.Start(); } private void tabs_Selected(object sender, TabControlEventArgs e) @@ -196,5 +256,30 @@ namespace ShiftOS.WinForms.Applications { AppearanceManager.SetupDialog(new FileDialog(new string[] { ".bf" }, FileOpenerStyle.Save, new Action<string>((file) => Objects.ShiftFS.Utils.WriteAllText(file, programinput.Text)))); } + + private void KillThread() + { + if (InterpreterThread != null) + try + { + InterpreterThread.Abort(); + } + catch { } + consoleout.KeyPress -= consolestr.handler; + } + + private void stop_Click(object sender, EventArgs e) + { + KillThread(); + } + + private void reset_Click(object sender, EventArgs e) + { + if (InterpreterThread != null) + if (InterpreterThread.IsAlive) + Infobox.Show("Cannot Reset", "The program is still running."); + else + Interpreter.Reset(); + } } } |
