void StartRender ()
{
is_rendering = true;
cancel_render_flag = false;
restart_render_flag = false;
is_updated = false;
render_id++;
render_exceptions.Clear ();
current_tile = -1;
total_tiles = CalculateTotalTiles ();
Debug.WriteLine ("AsyncEffectRenderer.Start () Render " + render_id + " starting.");
// Copy the current render id.
int renderId = render_id;
// Start slave render threads.
int threadCount = settings.ThreadCount;
var slaves = new Thread[threadCount - 1];
for (int threadId = 1; threadId < threadCount; threadId++)
slaves[threadId - 1] = StartSlaveThread (renderId, threadId);
// Start the master render thread.
var master = new Thread (() => {
// Do part of the rendering on the master thread.
Render (renderId, 0);
// Wait for slave threads to complete.
foreach (var slave in slaves)
slave.Join ();
// Change back to the UI thread to notify of completion.
Gtk.Application.Invoke ((o,e) => HandleRenderCompletion ());
});
master.Priority = settings.ThreadPriority;
master.Start ();
// Start timer used to periodically fire update events on the UI thread.
timer_tick_id = GLib.Timeout.Add((uint) settings.UpdateMillis, HandleTimerTick);
}