Pregunta

Estoy usando el ToolStripDropDown Para mostrar una SelectionPopup.

los ToolStripDropDown Contiene algunos controles personalizados con hilos en ejecución. Los hilos terminan con el evento OnHandledEnstoyed, pero por alguna razón el ToolStripDropDown No elimina/destruye su mango después del cierre.

Eliminando el ToolStripDropDown En el evento cerrado me da una excepción porque cualquier cosa aún accede a ToolStripdropdown.

¿Cómo sé si el control personalizado todavía está en uso o no para finalizar el hilo?

Control personalizado:

public class CControl : Control
{
    Thread StyleThread;
    Object lockOBJ = new Object();
    bool abortthread = false;

    public CControl()
    {
        this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer, true);
        this.SetStyle(ControlStyles.Selectable, false);

        StyleThread = new Thread(new ThreadStart(this.StyleDelegate));
    }


    protected override void OnHandleCreated(EventArgs e)
    {
        base.OnHandleCreated(e);
        if(!StyleThread.IsAlive)
            StyleThread.Start();
    }

    protected override void OnHandleDestroyed(EventArgs e)
    {
        base.OnHandleDestroyed(e);
        lock (lockOBJ)
        {
            abortthread = true;
        }
        if (StyleThread.IsAlive)
        {
            StyleThread.Join(100);
        }
    }

    ...
}

ToolStripdropDown-Control:

public class AddPopUp : UserControl
{
    /*
        ------------------------------------
        This Control contains some CControls
        ------------------------------------
    */

    public void Show(Control control)
    {
        TSDD tsdd = new TSDD(this);
        Point screenpoint = control.PointToScreen(new Point(0, 0));
        tsdd.Show(control,new Point(0, -tsdd.Height ));
    }

    class TSDD : ToolStripDropDown
    {
        private Control Control { get; set; }

        public TSDD(Control control)
        {
            this.Control = control;
            this.DropShadowEnabled = false;
            ToolStripControlHost ch = new ToolStripControlHost(control);
            this.Items.Add(ch);
        }

        protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified)
        {
            base.SetBoundsCore(x, y, Control.Size.Width + 16, Control.Size.Height + 18, specified);
        }

        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                unchecked
                {
                    cp.Style |= (int)0x80000000;
                    cp.Style |= 0x40000;
                }
                return cp;
            }
        }


        protected override void WndProc(ref Message m)
        {
            if (m.Msg == 0x84)
            {
                m.Result = (IntPtr)1;
                return;
            }
            base.WndProc(ref m);
        }
    }
}

EDITAR:

Después de las mismas pruebas, no pude deshacerse de ToolStripdropdown. Como solución alternativa, solo estoy destruyendo el mango en el cierre de ToolStripdropdown.

        protected override void OnClosed(ToolStripDropDownClosedEventArgs e)
        {
            base.OnClosed(e);
            this.DestroyHandle();
        }
¿Fue útil?

Solución

ToolStrips tiene un error muy persistente (afirmado que se soluciona, pero todavía tengo problemas) en los que registran un controlador de eventos a SystemEvents. UserPreferenceChanged para poder volver a pintar si el usuario cambia la configuración de estilo global en el sistema operativo.

La única solución que he encontrado es eliminar las tierras de herramientas adjuntas enumerando los manejadores en los sistemas.

Toolstrip Memory Fuge

http://connect.microsoft.com/visualstudio/feedback/details/115600/toolstrip-leaks-after-calling-dispose#

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top