2 using System
.Collections
;
3 using System
.Threading
;
11 private IPlugin Plugin
;
14 private Exception Error
;
15 private Engine2 engine
;
16 private bool finished
= false;
18 private void ThreadedWork()
32 public EngineThread(Engine2 engine
, Block b
)
38 MainWindow
.RedrawSchematic();
42 if(b
.Plugin
.NumIn
!= 0)
44 CommSocket cs
= new CommSocket(b
.Plugin
.NumIn
);
46 for(int i
=0; i
<b
.Plugin
.NumIn
; i
++)
48 Socket other
= b
.SocketIn
[i
].Other
;
50 if(other
.Parent
.Plugin
.Out
== null)
54 throw new PluginException(Catalog
.GetString("Plugin has no data on output sockets."));
57 cs
[i
] = other
.Parent
.Plugin
.Out
[other
.Num
];
64 t
= new Thread(ThreadedWork
);
72 MainWindow
.RedrawSchematic();
73 new PluginError(e
, b
, false);
83 MainWindow
.RedrawSchematic();
103 MainWindow
.RedrawSchematic();
111 MainWindow
.RedrawSchematic();
112 new PluginError(e
, b
, false);
123 private static int ConfigThreads
= Config
.Get("engine/threads", 1);
124 private static bool ConfigProgress
= Config
.Get("block/progress", true);
126 private ArrayList Threads
= new ArrayList();
127 private bool stop
= false;
128 private bool running
= false;
129 private FinishCallback finish
;
130 private Progress progress
;
131 private DateTime start
, end
;
133 public delegate void FinishCallback();
134 public delegate void Progress();
136 public Engine2(Schematic s
, FinishCallback finish
, Progress progress
)
139 this.finish
= finish
;
140 this.progress
= progress
;
153 // sprawdzenie, czy jakiś wątek nie skończył pracy
154 for(int i
=Threads
.Count
-1; i
>=0; i
--)
155 if(((EngineThread
)Threads
[i
]).Finished
)
157 // w przypadku błędu praca jest skończona
169 // jeżeli są jakieś wolne sloty na wątki, to trzeba spróbować je wypełnić
170 if(Threads
.Count
< ConfigThreads
)
172 ArrayList Blocks
= s
.Blocks
;
174 for(int i
=0; i
<Blocks
.Count
; i
++)
176 // sprawdzenie czy są wolne wątki
177 if(Threads
.Count
>= ConfigThreads
)
180 Block b
= (Block
)Blocks
[i
];
182 if(b
.CheckState() == Block
.State
.Ready
&& b
.Working
!= true)
183 Threads
.Add(new EngineThread(this, b
));
187 // sprawdzenie czy zostały jakieś wątki
188 if(Threads
.Count
== 0)
199 MainWindow
.RedrawSchematic();
206 // nie powinno nigdy się zdarzyć
208 throw new Exception(Catalog
.GetString("Engine is already running."));
210 start
= DateTime
.Now
;
212 ArrayList Blocks
= s
.Blocks
;
217 // przejrzenie wszystkich bloków i dodanie gotowych do pracy do listy wątków
218 for(int i
=0; i
<Blocks
.Count
; i
++)
220 // sprawdzenie czy są wolne wątki
221 if(Threads
.Count
>= ConfigThreads
)
224 Block b
= (Block
)Blocks
[i
];
226 if(b
.CheckState() == Block
.State
.Ready
)
227 Threads
.Add(new EngineThread(this, b
));
230 // sprawdzanie stanu wątków co 50 ms
231 GLib
.Timeout
.Add(50, new GLib
.TimeoutHandler(Tick
));
234 // zatrzymuje wszystkie wątki
239 foreach(EngineThread t
in Threads
)
242 Threads
.RemoveRange(0, Threads
.Count
);
245 public static void CheckGConf()
247 ConfigThreads
= Config
.Get("engine/threads", 1);
248 ConfigProgress
= Config
.Get("block/progress", true);
253 get { return running; }
256 public string ElapsedTime
260 TimeSpan ts
= end
- start
;
265 return String
.Format("{0:00}.{1}", ts
.Seconds
, ts
.Milliseconds
);
267 return String
.Format("{0:00}:{1:00}.{2}", ts
.Minutes
, ts
.Seconds
, ts
.Milliseconds
);
269 return String
.Format("{0:00}:{1:00}:{2:00}.{3}", ts
.Hours
, ts
.Minutes
, ts
.Seconds
, ts
.Milliseconds
);
271 return String
.Format("{0}.{1:00}:{2:00}:{3:00}.{4}", ts
.Days
, ts
.Hours
, ts
.Minutes
, ts
.Seconds
, ts
.Milliseconds
);