System.InvalidOperationException: объект в настоящее время используется в другом месте - PullRequest
0 голосов
/ 03 апреля 2012

Кажется, я получаю эту ошибку при попытке рисовать на панели.Я не эксперт в C #, так что, надеюсь, кто-то здесь может мне помочь с этим.Заранее спасибо.

Показывает трассировку стека,

в System.Drawing.Graphics.set_Transform (значение матрицы) в Victoria.Robotics.Marvin.Teleoperation.MainForm.DrawXYAxis (графика g) вC: \ Users \ kasunt \ Microsoft Robotics Dev Studio 2008 R3 \ Marvin \ Teleoperation \ MainForm.cs: строка 2173 в Victoria.Robotics.Marvin.Teleoperation.MainForm.envMap_Paint (отправитель объекта, PaintEventArgs e) в C: \ Users \ kasunt\ Microsoft Robotics Dev Studio 2008 R3 \ Marvin \ Teleoperation \ MainForm.cs: строка 2143 в System.Windows.Forms.Control.OnPaint (PaintEventArgs e) в System.Windows.Forms.Control.PaintWithErrorHandling (PaintEventArgs e, слой Int16, логический)disposeEventArgs) в System.Windows.Forms.Control.WmPaint (Message & m) в System.Windows.Forms.Control.WndProc (Message & m) в System.Windows.Forms.ScrollableControl.WndProc (Message & m) в System.Windows.Forms.Control.ControlNativeWindow.OnMessage (Message & m) в System.Windows.Forms.Control.ControlNativeWindow.WndProc (Message & m) в System.Windows.Forms.NativeWindow.Callback (IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Код ниже.Кажется, возникает ошибка при настройке преобразования,

    private void envMap_Paint(object sender, PaintEventArgs e)
    {
        DrawXYAxis(e.Graphics);
    }

    /// <summary>
    /// Helper to draw the XY axis and plot the map
    /// </summary>
    public void DrawXYAxis(Graphics g)
    {
        Rectangle rect = envMap.ClientRectangle;

        myPen = new Pen(Color.Black, 1);
        g.PageUnit = GraphicsUnit.Millimeter;
        g.PageScale = 0.1F;
        IntPtr hdc = g.GetHdc();
        int hMemDC = hdc.ToInt32();

        // Reverse the axis of the drawing surface
        Matrix mx = new Matrix(1, 0, 0, -1, 0, envMap.ClientSize.Height * 2);
        g.Transform = mx;
        g.TranslateTransform(50, 100, MatrixOrder.Append);

        // For drawing X - AXIS
        g.DrawLine(myPen, 0, 0, (2 * rect.Right - 60), 0);
        // For drawing Y - AXIS
        g.DrawLine(myPen, 0, 0, 0, 2 * rect.Bottom);

        // For drawing Arrow on X-AXIS
        g.DrawLine(myPen, (2 * rect.Right - 60) - 15, 8, (2 * rect.Right - 60), 0);
        g.DrawLine(myPen, (2 * rect.Right - 60), 0, (2 * rect.Right - 60) - 15, -8);

        // For drawing Arrow on Y-AXIS
        g.DrawLine(myPen, 8, 2 * rect.Bottom - 15, 0, 2 * rect.Bottom);
        g.DrawLine(myPen, 0, 2 * rect.Bottom, -8, 2 * rect.Bottom - 15);

        // Save the state to restore later
        GraphicsState state = g.Save();

        // Create a matrix to offset the text to the desired position and flip it the
        // right way up again
        Matrix mx2 = new Matrix(1, 0, 0, -1, 0, 0);
        Matrix mx1 = mx.Clone();
        mx1.Multiply(mx2);
        g.Transform = mx1;
        SolidBrush drawBrush = new SolidBrush(Color.Black);
        Font drawFont = new Font("Microsoft Sans Serif", 9, FontStyle.Bold);
        StringFormat sF = new StringFormat(StringFormatFlags.NoClip);
        sF.Alignment = StringAlignment.Center;
        g.DrawString("X", drawFont, drawBrush, (2 * rect.Right - 40), -2 * Font.Height, sF);
        g.DrawString("Y", drawFont, drawBrush, -40, -(2 * rect.Height + 2 * Font.Height), sF);

        // Restore state
        g.Restore(state);

        drawFont = new Font("Microsoft Sans Serif", 7);

        // Drawing Tick Marks and Labels
        // NOTE THE LABELS ON THE AXES WILL CHANGE TO REFFECT THE REAL POSITION OF THE ROBOT....
        myPen.Dispose();
   }

Строка # 2173,

        g.Transform = mx;

Строка # 2143,

        DrawXYAxis(e.Graphics);

Ответы [ 2 ]

3 голосов
/ 03 апреля 2012

Это исключение, которое обычно вызывается незаконным использованием графического контекста в другом потоке.Я должен был бы предположить, что есть другой код в вашей программе, который также делает что-то с графикой.

Если вы не знаете, что это может быть за код, используйте Debug + Windows + Threads и просматривайте стеки вызововтемы там перечислены.Также поищите любое назначение Control.CheckForIllegalCrossThreadCalls в вашем исходном коде.Вы захотите удалить этот оператор, чтобы получить лучшую диагностику при нарушении требований многопоточности.

0 голосов
/ 04 апреля 2012

Оказалось, из-за следующих двух строк,

    IntPtr hdc = g.GetHdc();
    int hMemDC = hdc.ToInt32();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...