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);
125 private ArrayList Threads
= new ArrayList();
126 private bool stop
= false;
127 private bool running
= false;
128 private FinishCallback finish
;
129 private DateTime start
, end
;
131 public delegate void FinishCallback();
133 public Engine2(Schematic s
, FinishCallback finish
)
136 this.finish
= finish
;
149 // sprawdzenie, czy jakiś wątek nie skończył pracy
150 for(int i
=Threads
.Count
-1; i
>=0; i
--)
151 if(((EngineThread
)Threads
[i
]).Finished
)
153 // w przypadku błędu praca jest skończona
165 // jeżeli są jakieś wolne sloty na wątki, to trzeba spróbować je wypełnić
166 if(Threads
.Count
< ConfigThreads
)
168 ArrayList Blocks
= s
.Blocks
;
170 for(int i
=0; i
<Blocks
.Count
; i
++)
172 // sprawdzenie czy są wolne wątki
173 if(Threads
.Count
>= ConfigThreads
)
176 Block b
= (Block
)Blocks
[i
];
178 if(b
.CheckState() == Block
.State
.Ready
&& b
.Working
!= true)
179 Threads
.Add(new EngineThread(this, b
));
183 // sprawdzenie czy zostały jakieś wątki
184 if(Threads
.Count
== 0)
197 // nie powinno nigdy się zdarzyć
199 throw new Exception(Catalog
.GetString("Engine is already running."));
201 start
= DateTime
.Now
;
203 ArrayList Blocks
= s
.Blocks
;
208 // przejrzenie wszystkich bloków i dodanie gotowych do pracy do listy wątków
209 for(int i
=0; i
<Blocks
.Count
; i
++)
211 // sprawdzenie czy są wolne wątki
212 if(Threads
.Count
>= ConfigThreads
)
215 Block b
= (Block
)Blocks
[i
];
217 if(b
.CheckState() == Block
.State
.Ready
)
218 Threads
.Add(new EngineThread(this, b
));
221 // sprawdzanie stanu wątków co 50 ms
222 GLib
.Timeout
.Add(50, new GLib
.TimeoutHandler(Tick
));
225 // zatrzymuje wszystkie wątki
230 foreach(EngineThread t
in Threads
)
233 Threads
.RemoveRange(0, Threads
.Count
);
236 public static void CheckGConf()
238 ConfigThreads
= Config
.Get("engine/threads", 1);
243 get { return running; }
246 public string ElapsedTime
250 TimeSpan ts
= end
- start
;
255 return String
.Format("{0:00}.{1}", ts
.Seconds
, ts
.Milliseconds
);
257 return String
.Format("{0:00}:{1:00}.{2}", ts
.Minutes
, ts
.Seconds
, ts
.Milliseconds
);
259 return String
.Format("{0:00}:{1:00}:{2:00}.{3}", ts
.Hours
, ts
.Minutes
, ts
.Seconds
, ts
.Milliseconds
);
261 return String
.Format("{0}.{1:00}:{2:00}:{3:00}.{4}", ts
.Days
, ts
.Hours
, ts
.Minutes
, ts
.Seconds
, ts
.Milliseconds
);