From 4c8078f636c14f57e11df0e249d2ecd43993e6c3 Mon Sep 17 00:00:00 2001 From: Mike Bild Date: Tue, 7 Jan 2014 17:14:05 +0100 Subject: [PATCH 1/3] refactor to windowing --- RxTimeout/Form1.cs | 159 ++++++++++++++++++++++----------------------- 1 file changed, 79 insertions(+), 80 deletions(-) diff --git a/RxTimeout/Form1.cs b/RxTimeout/Form1.cs index da7844e..2e2428b 100644 --- a/RxTimeout/Form1.cs +++ b/RxTimeout/Form1.cs @@ -9,101 +9,100 @@ namespace RxTimeout { - public partial class Form1 : Form - { - int _offset; - - public Form1() + public partial class Form1 : Form { - InitializeComponent(); - - RxMessageBrokerMinimod.Default.Register(Message, new ControlScheduler(this)); - RxMessageBrokerMinimod.Default.Register(Start, TaskPoolScheduler.Default); - } + int _offset; - void Start(Start obj) - { - RxMessageBrokerMinimod.Default.Send(new Message("1")); - // put Thread.Sleep(20) here and it works... - RxMessageBrokerMinimod.Default.Send(new Message("2")); - RxMessageBrokerMinimod.Default.Send(new Message("3")); - } + public Form1() + { + InitializeComponent(); + + //RxMessageBrokerMinimod.Default.Register(CreateDisplayMessage, new ControlScheduler(this)); + RxMessageBrokerMinimod.Default.Register(Start, TaskPoolScheduler.Default); + + RxMessageBrokerMinimod.Default.Stream + .OfType() + .ObserveOn(new ControlScheduler(this)) + + .Do(message => + { + //Alternative könnte hier auch ein Select auf CreateDisplayMessage(...) gemacht werden + message.DisplayMessage = CreateDisplayMessage(message); + }) + .Window(1) + .Do(x => x + .Delay(TimeSpan.FromSeconds(5)) + .ObserveOn(new ControlScheduler(this)) + .Do(p => + { + Controls.Remove(p.DisplayMessage); + p.DisplayMessage.Dispose(); + }) + .Subscribe()) + .Subscribe(); + } + + void Start(Start obj) + { + RxMessageBrokerMinimod.Default.Send(new Message("1")); + RxMessageBrokerMinimod.Default.Send(new Message("2")); + RxMessageBrokerMinimod.Default.Send(new Message("3")); + } - void Message(Message message) - { - Debug.WriteLine(DateTimeOffset.Now.Ticks + " > " + message.Value); + Control CreateDisplayMessage(Message message) + { + Debug.WriteLine(DateTimeOffset.Now.Ticks + " > " + message.Value); - var label = CreateLabel(); + var label = CreateLabel(); - label.Text = message.Value; + label.Text = message.Value; - label.Size = label.GetPreferredSize(Size); - if (label.Width < ClientRectangle.Width) - { - label.Width += 15; - } - label.Location = new Point(1, ClientRectangle.Height - label.Height - 1 - _offset); - _offset += 15; - label.Visible = true; - Controls.Add(label); - Controls.SetChildIndex(label, 0); + label.Size = label.GetPreferredSize(Size); + if (label.Width < ClientRectangle.Width) + { + label.Width += 15; + } + label.Location = new Point(1, ClientRectangle.Height - label.Height - 1 - _offset); + _offset += 15; + label.Visible = true; + Controls.Add(label); + Controls.SetChildIndex(label, 0); - RemoveOnTimeoutOrNextMessage(label); + Debug.WriteLine(DateTimeOffset.Now.Ticks + " < " + message.Value); + return label; + } - Debug.WriteLine(DateTimeOffset.Now.Ticks + " < " + message.Value); - } + void button1_Click(object sender, EventArgs e) + { + RxMessageBrokerMinimod.Default.Send(new Start()); + } - void RemoveOnTimeoutOrNextMessage(Control control) - { - const long ItDoesNotMatter = 42L; - - var timeout = Observable.Timer(TimeSpan.FromSeconds(5)); - var nextMessage = RxMessageBrokerMinimod.Default.Stream - .OfType() - .Select(_ => ItDoesNotMatter) - .FirstAsync(); - - nextMessage - .Amb(timeout) - .ObserveOn(this) - .Do(_ => + static Label CreateLabel() { - Controls.Remove(control); - control.Dispose(); - }) - .Subscribe(); + return new Label + { + Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right, + Name = "message" + Guid.NewGuid(), + Padding = new Padding(2), + TextAlign = ContentAlignment.BottomLeft, + UseMnemonic = false, + Visible = false + }; + } } - void button1_Click(object sender, EventArgs e) + class Start { - RxMessageBrokerMinimod.Default.Send(new Start()); } - static Label CreateLabel() + class Message { - return new Label - { - Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right, - Name = "message" + Guid.NewGuid(), - Padding = new Padding(2), - TextAlign = ContentAlignment.BottomLeft, - UseMnemonic = false, - Visible = false - }; - } - } - - class Start - { - } + public Message(string value) + { + Value = value; + } - class Message - { - public Message(string value) - { - Value = value; + public string Value { get; set; } + public Control DisplayMessage { get; set; } } - - public string Value { get; set; } - } -} +} \ No newline at end of file From afa68fca2028ec2e3ac78245056fb94aeeb97402 Mon Sep 17 00:00:00 2001 From: Mike Bild Date: Tue, 7 Jan 2014 17:23:13 +0100 Subject: [PATCH 2/3] Revert "refactor to windowing" This reverts commit 4c8078f636c14f57e11df0e249d2ecd43993e6c3. --- RxTimeout/Form1.cs | 159 +++++++++++++++++++++++---------------------- 1 file changed, 80 insertions(+), 79 deletions(-) diff --git a/RxTimeout/Form1.cs b/RxTimeout/Form1.cs index 2e2428b..da7844e 100644 --- a/RxTimeout/Form1.cs +++ b/RxTimeout/Form1.cs @@ -9,100 +9,101 @@ namespace RxTimeout { - public partial class Form1 : Form + public partial class Form1 : Form + { + int _offset; + + public Form1() { - int _offset; + InitializeComponent(); - public Form1() - { - InitializeComponent(); - - //RxMessageBrokerMinimod.Default.Register(CreateDisplayMessage, new ControlScheduler(this)); - RxMessageBrokerMinimod.Default.Register(Start, TaskPoolScheduler.Default); - - RxMessageBrokerMinimod.Default.Stream - .OfType() - .ObserveOn(new ControlScheduler(this)) - - .Do(message => - { - //Alternative könnte hier auch ein Select auf CreateDisplayMessage(...) gemacht werden - message.DisplayMessage = CreateDisplayMessage(message); - }) - .Window(1) - .Do(x => x - .Delay(TimeSpan.FromSeconds(5)) - .ObserveOn(new ControlScheduler(this)) - .Do(p => - { - Controls.Remove(p.DisplayMessage); - p.DisplayMessage.Dispose(); - }) - .Subscribe()) - .Subscribe(); - } - - void Start(Start obj) - { - RxMessageBrokerMinimod.Default.Send(new Message("1")); - RxMessageBrokerMinimod.Default.Send(new Message("2")); - RxMessageBrokerMinimod.Default.Send(new Message("3")); - } + RxMessageBrokerMinimod.Default.Register(Message, new ControlScheduler(this)); + RxMessageBrokerMinimod.Default.Register(Start, TaskPoolScheduler.Default); + } - Control CreateDisplayMessage(Message message) - { - Debug.WriteLine(DateTimeOffset.Now.Ticks + " > " + message.Value); + void Start(Start obj) + { + RxMessageBrokerMinimod.Default.Send(new Message("1")); + // put Thread.Sleep(20) here and it works... + RxMessageBrokerMinimod.Default.Send(new Message("2")); + RxMessageBrokerMinimod.Default.Send(new Message("3")); + } - var label = CreateLabel(); + void Message(Message message) + { + Debug.WriteLine(DateTimeOffset.Now.Ticks + " > " + message.Value); - label.Text = message.Value; + var label = CreateLabel(); - label.Size = label.GetPreferredSize(Size); - if (label.Width < ClientRectangle.Width) - { - label.Width += 15; - } - label.Location = new Point(1, ClientRectangle.Height - label.Height - 1 - _offset); - _offset += 15; - label.Visible = true; - Controls.Add(label); - Controls.SetChildIndex(label, 0); + label.Text = message.Value; - Debug.WriteLine(DateTimeOffset.Now.Ticks + " < " + message.Value); - return label; - } + label.Size = label.GetPreferredSize(Size); + if (label.Width < ClientRectangle.Width) + { + label.Width += 15; + } + label.Location = new Point(1, ClientRectangle.Height - label.Height - 1 - _offset); + _offset += 15; + label.Visible = true; + Controls.Add(label); + Controls.SetChildIndex(label, 0); - void button1_Click(object sender, EventArgs e) - { - RxMessageBrokerMinimod.Default.Send(new Start()); - } + RemoveOnTimeoutOrNextMessage(label); - static Label CreateLabel() + Debug.WriteLine(DateTimeOffset.Now.Ticks + " < " + message.Value); + } + + void RemoveOnTimeoutOrNextMessage(Control control) + { + const long ItDoesNotMatter = 42L; + + var timeout = Observable.Timer(TimeSpan.FromSeconds(5)); + var nextMessage = RxMessageBrokerMinimod.Default.Stream + .OfType() + .Select(_ => ItDoesNotMatter) + .FirstAsync(); + + nextMessage + .Amb(timeout) + .ObserveOn(this) + .Do(_ => { - return new Label - { - Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right, - Name = "message" + Guid.NewGuid(), - Padding = new Padding(2), - TextAlign = ContentAlignment.BottomLeft, - UseMnemonic = false, - Visible = false - }; - } + Controls.Remove(control); + control.Dispose(); + }) + .Subscribe(); } - class Start + void button1_Click(object sender, EventArgs e) { + RxMessageBrokerMinimod.Default.Send(new Start()); } - class Message + static Label CreateLabel() { - public Message(string value) - { - Value = value; - } + return new Label + { + Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right, + Name = "message" + Guid.NewGuid(), + Padding = new Padding(2), + TextAlign = ContentAlignment.BottomLeft, + UseMnemonic = false, + Visible = false + }; + } + } + + class Start + { + } - public string Value { get; set; } - public Control DisplayMessage { get; set; } + class Message + { + public Message(string value) + { + Value = value; } -} \ No newline at end of file + + public string Value { get; set; } + } +} From 2ac087748e454a11fe70bcf9ca641bdc75a5a030 Mon Sep 17 00:00:00 2001 From: Mike Bild Date: Tue, 7 Jan 2014 17:50:34 +0100 Subject: [PATCH 3/3] remove+add label --- RxTimeout/Form1.cs | 79 ++++++++++++++++++++++++---------------------- 1 file changed, 42 insertions(+), 37 deletions(-) diff --git a/RxTimeout/Form1.cs b/RxTimeout/Form1.cs index da7844e..1467a10 100644 --- a/RxTimeout/Form1.cs +++ b/RxTimeout/Form1.cs @@ -3,77 +3,81 @@ using System.Drawing; using System.Reactive.Concurrency; using System.Reactive.Linq; +using System.Threading; using System.Windows.Forms; using Minimod.RxMessageBroker; namespace RxTimeout { + public partial class Form1 : Form { - int _offset; + int _offset; + private Label _label; public Form1() { - InitializeComponent(); + InitializeComponent(); + + RxMessageBrokerMinimod.Default.Register(Start, TaskPoolScheduler.Default); + + var displayMessageStream = Observable.Empty(); + displayMessageStream = RxMessageBrokerMinimod.Default.Stream + .OfType() + .ObserveOn(new ControlScheduler(this)) + .Do(_ => + { + if (_label == null) return; + Controls.Remove(_label); + _label.Dispose(); + }) + .Do(CreateAndDisplayLabel) + .Timeout(TimeSpan.FromSeconds(5)) + .ObserveOn(new ControlScheduler(this)) + .Catch((Exception error) => + { + Controls.Remove(_label); + _label.Dispose(); + return displayMessageStream; + }); + displayMessageStream.Subscribe(); + + - RxMessageBrokerMinimod.Default.Register(Message, new ControlScheduler(this)); - RxMessageBrokerMinimod.Default.Register(Start, TaskPoolScheduler.Default); } void Start(Start obj) { RxMessageBrokerMinimod.Default.Send(new Message("1")); - // put Thread.Sleep(20) here and it works... RxMessageBrokerMinimod.Default.Send(new Message("2")); RxMessageBrokerMinimod.Default.Send(new Message("3")); } - void Message(Message message) + void CreateAndDisplayLabel(Message message) { Debug.WriteLine(DateTimeOffset.Now.Ticks + " > " + message.Value); - var label = CreateLabel(); + _label = CreateLabel(); - label.Text = message.Value; + _label.Text = message.Value; - label.Size = label.GetPreferredSize(Size); - if (label.Width < ClientRectangle.Width) + _label.Size = _label.GetPreferredSize(Size); + if (_label.Width < ClientRectangle.Width) { - label.Width += 15; + _label.Width += 15; } - label.Location = new Point(1, ClientRectangle.Height - label.Height - 1 - _offset); + _label.Location = new Point(1, ClientRectangle.Height - _label.Height - 1 - _offset); _offset += 15; - label.Visible = true; - Controls.Add(label); - Controls.SetChildIndex(label, 0); + _label.Visible = true; + Controls.Add(_label); + Controls.SetChildIndex(_label, 0); - RemoveOnTimeoutOrNextMessage(label); + //RemoveOnTimeoutOrNextMessage(label); Debug.WriteLine(DateTimeOffset.Now.Ticks + " < " + message.Value); } - void RemoveOnTimeoutOrNextMessage(Control control) - { - const long ItDoesNotMatter = 42L; - - var timeout = Observable.Timer(TimeSpan.FromSeconds(5)); - var nextMessage = RxMessageBrokerMinimod.Default.Stream - .OfType() - .Select(_ => ItDoesNotMatter) - .FirstAsync(); - - nextMessage - .Amb(timeout) - .ObserveOn(this) - .Do(_ => - { - Controls.Remove(control); - control.Dispose(); - }) - .Subscribe(); - } - void button1_Click(object sender, EventArgs e) { RxMessageBrokerMinimod.Default.Send(new Start()); @@ -105,5 +109,6 @@ public Message(string value) } public string Value { get; set; } + public Control Label { get; set; } } }