diff --git a/OliviaAddInPro.csproj b/OliviaAddInPro.csproj index e12cb60..4cd03c5 100644 --- a/OliviaAddInPro.csproj +++ b/OliviaAddInPro.csproj @@ -155,6 +155,7 @@ + diff --git a/Services/EjecServ.cs b/Services/EjecServ.cs index c257dc1..05c7aaa 100644 --- a/Services/EjecServ.cs +++ b/Services/EjecServ.cs @@ -145,7 +145,7 @@ namespace OliviaAddInPro.Services return null; } cps.Value = 30; - + //prepara el filtro con consulta y espacial SpatialQueryFilter filtro = CreaFiltro(com.ConsultaAmbs, geomAux); diff --git a/Services/ProcesoEjecServ.cs b/Services/ProcesoEjecServ.cs new file mode 100644 index 0000000..ea0c1a2 --- /dev/null +++ b/Services/ProcesoEjecServ.cs @@ -0,0 +1,201 @@ +using ArcGIS.Desktop.Framework.Threading.Tasks; +using OliviaAddIn; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace OliviaAddInPro.Services +{ + class ProcesoEjecServ + { + Cstr_socket soc = null; + int m_out; + int m_miliseconds; + int m_tm_progr; + int modo_fin = 0; + bool cancela = false; + bool cancela_fin = false; + bool conectado = false; + bool permu = false; + bool cancela_permu = false; + int progr = 0; + string args = ""; + string str_cfg = ""; + string tarea = ""; + public string err_str = ""; + double x, y; + CancelableProgressorSource cps; + enum TiposActu + { + ActuMal, + ActuNoActu, + ActuBien, + ActuPermu, + ActuMulti, + ActuFinOk, + ActuSect, + ActuPlan, + ActuFinNOk, + ActuN, + } + + + public ProcesoEjecServ() + { + + } + public void start(string cfg, CancelableProgressorSource cps) + { + this.cps = cps; + soc = new Cstr_socket(); + + str_cfg = cfg; + /* + await ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run(() => + { + run(); + };*/ + run(); + } + private void run() + { + int nint = 0; + int nint_max = 10; + bool sal = false; + bool first_send_cfg = true; + bool fin = false; + int lastprog = 0; + TiposActu pp; + try + { + do + { + Thread.Sleep(m_miliseconds); + + if (first_send_cfg)//a continuación envía la configuración + { + Thread.Sleep(500); + if (!envia_cfg()) + { + if (nint >= nint_max) + { + err_str = "Error en la comunicación con OliviaTask"; + actualiza(TiposActu.ActuMal); + } + else + nint++; + } + else + first_send_cfg = false; + } + + if (Interlocked.Equals(m_out, 1)) //mira a ver si ha cancelado el usuario + { + //se ha cancelado, lo envía al OliviaTask + envia_cancel(); + if (!cancela_permu) + sal = true; + else + { + Interlocked.Exchange(ref m_out, (int)0); + cancela_permu = false; + } + } + else if (!first_send_cfg && ((Math.Abs(Environment.TickCount) - lastprog) >= m_tm_progr) && !fin) //en caso normal, todo va bien, pide el progreso y la tarea + { + //solo pide la programación cada m_tm_progr milis + pp = pide_progr(); + if (pp > TiposActu.ActuFinOk) + fin = true; + actualiza(pp); + lastprog = Environment.TickCount; + } + + } while (!sal); + + //manda cerrar la ventana porque ha terminado + cierra(); + } + catch (Exception) + { + //MessageBox.Show("Error durante el proceso.", "Olivia", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + } + //funciones auxiliares---------------------------------------- + private void cierra() + { + + } + /** + * Envía la información de la configuración por socket a OliviaTask + */ + public bool envia_cfg() + { + return false; + } + /** + * Pide por socket la información de sectorización a OliviaTask + */ + private bool pide_sect() + { + return false; + } + /** + * Pide por socket la información de progreso a OliviaTask + * Devuelve 0 si ha ido mal, 1 si ha ido bien, 2 si ha recibido que hay que pedir sectorización + */ + private TiposActu pide_progr() + { + return TiposActu.ActuMal; + } + /** + * Envía a OliviaTask la orden de cancelar el proceso + */ + private bool envia_cancel() + { + return false; + } + /** + * Actualiza la barra de progreso + * bool fallo_soc : indica si ha habido fallo en el socket + */ + private void actualiza(TiposActu actu) + { + } + /* + * Para poder actualizar el texto de la ventana de progreso hay que llamar a invoke + * porque está desde otro thread + */ + private void pon_texto(String txt) + { + } + /* + * Para poder actualizar la barra de progreso hay que llamar a invoke + * porque está desde otro thread + * Actualiza el tipo de progreso y el texto + */ + private void pon_estilo() + { + } + /* + * Para poder actualizar la barra de progreso hay que llamar a invoke + * porque está desde otro thread + * Actualiza el estilo para indicar que ha habido error + */ + private void pon_barstate(TiposActu actu) + { + } + /* + * Para poder actualizar la barra de progreso hay que llamar a invoke + * porque está desde otro thread + * Actualiza el progreso + */ + private void pon_progr(int pro) + { + } + } +} \ No newline at end of file