45
|
1 using Implab.Parallels;
|
|
2 using System;
|
|
3 using System.Collections.Generic;
|
|
4 using System.Linq;
|
|
5 using System.Text;
|
|
6 using System.Threading;
|
|
7 using System.Threading.Tasks;
|
|
8 using System.Windows.Forms;
|
|
9
|
|
10 namespace Implab.Diagnostics.Interactive
|
|
11 {
|
|
12 public class InteractiveTracer: Disposable
|
|
13 {
|
|
14 TraceForm m_form;
|
|
15 SynchronizationContext m_syncGuiThread;
|
|
16 readonly IPromiseBase m_completed;
|
|
17 readonly Promise<object> m_started = new Promise<object>();
|
|
18
|
|
19 public InteractiveTracer() {
|
|
20 m_completed = AsyncPool.InvokeNewThread(() => {
|
|
21 GuiThread();
|
|
22 return 0;
|
|
23 });
|
|
24
|
|
25 m_started.Join();
|
|
26 }
|
|
27
|
|
28 void GuiThread() {
|
|
29 m_form = new TraceForm(); // will create SynchronizationContext
|
|
30 m_syncGuiThread = SynchronizationContext.Current;
|
|
31 m_started.Resolve();
|
|
32 Application.Run();
|
|
33 }
|
|
34
|
|
35 public void ShowForm() {
|
|
36 m_syncGuiThread.Post(x => m_form.Show(), null);
|
|
37 }
|
|
38
|
|
39 public void HideForm() {
|
|
40 m_syncGuiThread.Post(x => m_form.Hide(), null);
|
|
41 }
|
|
42
|
|
43 void Terminate() {
|
|
44 m_syncGuiThread.Post(x => Application.ExitThread(), null);
|
|
45 }
|
|
46
|
|
47 protected override void Dispose(bool disposing) {
|
|
48 if (disposing) {
|
|
49 Terminate();
|
|
50 m_completed.Join();
|
|
51 }
|
|
52 base.Dispose(disposing);
|
|
53 }
|
|
54 }
|
|
55 }
|