add more multithreading samples

This commit is contained in:
Vsevolod Kukol 2014-07-17 22:36:13 +02:00 коммит произвёл Lluis Sanchez Gual
Родитель 8e9fa96cc0
Коммит 4aa0bcf92c
1 изменённых файлов: 164 добавлений и 2 удалений

Просмотреть файл

@ -24,6 +24,7 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE. // THE SOFTWARE.
using System; using System;
using System.ComponentModel;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Xwt; using Xwt;
@ -32,8 +33,9 @@ namespace Samples
{ {
public class MultithreadingSample: VBox public class MultithreadingSample: VBox
{ {
Label l1, l2; SampleBGWorker worker4, worker5, worker6;
ToggleButton btn1, btn2; Label l1, l2, l3, l4, l5, l6;
ToggleButton btn1, btn2, btn3, btn4, btn5, btn6;
public MultithreadingSample () public MultithreadingSample ()
{ {
@ -93,6 +95,166 @@ namespace Samples
else else
worker2cancel.Cancel(); worker2cancel.Cancel();
}; };
tbl.Add (new Label("BackgroundWorker:\n(XwtSynchronizationContext.Post)"), 0, r);
tbl.Add (l3 = new Label ("0"), 1, r);
tbl.Add (btn3 = new ToggleButton("Run"), 2, r++);
var worker3 = new BackgroundWorker ();
worker3.WorkerReportsProgress = true;
worker3.WorkerSupportsCancellation = true;
worker3.DoWork += BackgroundWorkerDoWork;
worker3.ProgressChanged += (sender, e) => l3.Text = e.ProgressPercentage.ToString ();
btn3.Toggled += delegate {
if (btn3.Active)
worker3.RunWorkerAsync ();
else
worker3.CancelAsync ();
};
tbl.Add (new Label("XwtSynchronizationContext.Send:"), 0, r);
tbl.Add (l4 = new Label ("0"), 1, r);
tbl.Add (btn4 = new ToggleButton("Run"), 2, r++);
worker4 = new SampleBGWorker ();
worker4.SynchronizationContext = SynchronizationContext.Current;
worker4.InvokeSynchronized = true;
worker4.Count += HandleCount4;
btn4.Toggled += delegate {
if (btn4.Active)
worker4.Start ();
else
worker4.Stop ();
};
tbl.Add (new Label("ISynchronizeInvoke.BeginInvoke:"), 0, r);
tbl.Add (l5 = new Label ("0"), 1, r);
tbl.Add (btn5 = new ToggleButton("Run"), 2, r++);
worker5 = new SampleBGWorker ();
worker5.InvokeSynchronized = false;
worker5.Count += HandleCount5;
btn5.Toggled += delegate {
if (btn5.Active)
worker5.Start ();
else
worker5.Stop ();
};
tbl.Add (new Label("ISynchronizeInvoke.Invoke:"), 0, r);
tbl.Add (l6 = new Label ("0"), 1, r);
tbl.Add (btn6 = new ToggleButton("Run"), 2, r++);
worker6 = new SampleBGWorker ();
worker6.InvokeSynchronized = true;
worker6.Count += HandleCount6;
btn6.Toggled += delegate {
if (btn6.Active)
worker6.Start ();
else
worker6.Stop ();
};
}
void BackgroundWorkerDoWork (object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = (BackgroundWorker)sender;
int cnt2 = 0;
while (!worker.CancellationPending) {
Thread.Sleep (50);
worker.ReportProgress(cnt2++);
}
e.Cancel = true;
}
void HandleCount4 (object sender, CounterEventArgs e)
{
l4.Text = e.Cnt.ToString ();
}
void HandleCount5 (object sender, CounterEventArgs e)
{
l5.Text = e.Cnt.ToString ();
}
void HandleCount6 (object sender, CounterEventArgs e)
{
l6.Text = e.Cnt.ToString ();
}
}
class SampleBGWorker
{
CancellationTokenSource stopReq;
Task task;
public event EventHandler<CounterEventArgs> Count;
public SynchronizationContext SynchronizationContext { get; set; }
public bool InvokeSynchronized { get; set; }
public void Start ()
{
stopReq = new CancellationTokenSource ();
task = Task.Factory.StartNew (CounterThread, stopReq.Token);
}
public void Stop ()
{
stopReq.Cancel ();
}
void CounterThread ()
{
int cnt = 0;
while (!stopReq.Token.IsCancellationRequested) {
Thread.Sleep (50);
cnt++;
if (Count != null) {
if (SynchronizationContext == null) {
foreach (var del in Count.GetInvocationList()) {
var target = del.Target as ISynchronizeInvoke;
if (target != null) {
if (InvokeSynchronized)
target.Invoke (del, new object[] { this, new CounterEventArgs (cnt) });
else
target.BeginInvoke (del, new object[] { this, new CounterEventArgs (cnt) });
}
}
} else {
var args = new CounterEventArgs (cnt);
if (InvokeSynchronized) {
SynchronizationContext.Send (delegate {
Count (this, args);
}, null);
} else {
SynchronizationContext.Post (delegate {
Count (this, args);
}, null);
}
}
}
}
}
}
class CounterEventArgs : EventArgs
{
public int Cnt { get; private set; }
public CounterEventArgs (int cnt)
{
Cnt = cnt;
} }
} }
} }