110,541
社区成员
private void Form1_Activated(object sender, EventArgs e)
{
Task.Run(() =>
{
Video();
});
}
private void pic_dingpeng_Paint(object sender, PaintEventArgs e)
{
Graphics ga = e.Graphics;
ga.DrawLine(pen, 220, q_s, 800, q_s);
ga.DrawLine(pen, 220, q_x, 800, q_x);
ga.DrawRectangle(pen, rect_kuang);
}
矩形是通过移动鼠标生成的,过一段就报警。
或者说怎么整,才能视频让不卡UI
在UI线程上绘制图像:可以将绘图的逻辑放在UI线程上执行,而不是使用Task.Run在后台线程中执行。这样就能确保在同一个线程上操作Graphics对象,避免跨线程访问。
private void Form1_Activated(object sender, EventArgs e)
{
Video();
}
private void pic_dingpeng_Paint(object sender, PaintEventArgs e)
{
Graphics ga = e.Graphics;
ga.DrawLine(pen, 220, q_s, 800, q_s);
ga.DrawLine(pen, 220, q_x, 800, q_x);
ga.DrawRectangle(pen, rect_kuang);
}
2.使用Invoke来更新UI控件:如果需要在后台线程中执行绘图操作,可以通过Control.Invoke方法在UI线程上执行相应的绘图代码,确保操作UI控件的线程安全性
private void Form1_Activated(object sender, EventArgs e)
{
Task.Run(() =>
{
Video();
});
}
private void UpdateUI()
{
if (this.InvokeRequired)
{
this.Invoke((MethodInvoker)delegate
{
// 在UI线程上执行绘图操作
pic_dingpeng.Invalidate();
});
}
else
{
pic_dingpeng.Invalidate();
}
}
private void pic_dingpeng_Paint(object sender, PaintEventArgs e)
{
Graphics ga = e.Graphics;
ga.DrawLine(pen, 220, q_s, 800, q_s);
ga.DrawLine(pen, 220, q_x, 800, q_x);
ga.DrawRectangle(pen, rect_kuang);
}
在C#中,在UI控件上绘制图像时,确保在UI线程上进行绘制是很重要的。如果在非UI线程上进行绘制,可能会导致出现"当前对象正在其他地方使用"的错误。
为了解决这个问题,你可以使用Invoke或BeginInvoke方法将绘制操作委托给UI线程。这样可以确保在UI线程上执行绘制操作,避免多线程冲突。
下面是一个示例代码,展示了如何在UI控件上绘制图像:
csharp
private void Form1_Activated(object sender, EventArgs e)
{
Task.Run(() =>
{
// 在后台线程加载图像
Image image = LoadImage();
// 在UI线程上绘制图像
this.Invoke((MethodInvoker)delegate
{
// 在paint事件中使用绘制图像
pictureBox1.Image = image;
pictureBox1.Invalidate(); // 强制重绘
});
});
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
// 在paint事件中进行绘制操作
Graphics g = e.Graphics;
// 绘制图像的代码...
}
private Image LoadImage()
{
// 加载图像的代码...
}