c#线程实现点元素随机移动
时间: 2023-10-16 15:06:18 浏览: 42
以下是使用 C# 线程实现点元素随机移动的代码实现:
```csharp
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Display;
using System.Threading;
namespace RandomPointMove
{
public partial class Form1 : Form
{
private IMapControl3 m_pMapControl;
private IGraphicsContainer m_pGraphicsContainer;
private IPoint m_pPoint;
private Thread m_pThread;
private bool m_bRun;
private Random m_pRandom;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
m_pMapControl = axMapControl1.Object as IMapControl3;
m_pGraphicsContainer = m_pMapControl.Map as IGraphicsContainer;
m_pRandom = new Random(DateTime.Now.Millisecond);
}
private void axMapControl1_OnMouseDown(object sender, IMapControlEvents2_OnMouseDownEvent e)
{
if (e.button == 1)
{
IPoint pPoint = m_pMapControl.ToMapPoint(e.x, e.y);
AddPointGraphic(pPoint);
}
}
private void AddPointGraphic(IPoint pPoint)
{
m_pPoint = pPoint;
IMarkerSymbol pMarkerSymbol = new SimpleMarkerSymbolClass();
IRgbColor pColor = new RgbColorClass();
pColor.Red = 255;
pMarkerSymbol.Color = pColor;
pMarkerSymbol.Size = 10;
IElement pElement = new MarkerElementClass();
pElement.Geometry = m_pPoint;
pElement.Symbol = pMarkerSymbol;
m_pGraphicsContainer.AddElement(pElement, 0);
m_pMapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
m_bRun = true;
m_pThread = new Thread(new ThreadStart(RandomMovePoint));
m_pThread.Start();
}
private void RandomMovePoint()
{
while (m_bRun)
{
double x = m_pPoint.X + m_pRandom.NextDouble() * 100 - 50;
double y = m_pPoint.Y + m_pRandom.NextDouble() * 100 - 50;
m_pPoint.PutCoords(x, y);
IElement pElement = m_pGraphicsContainer.Element[0];
pElement.Geometry = m_pPoint;
m_pGraphicsContainer.UpdateElement(pElement);
m_pMapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
Thread.Sleep(100);
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
m_bRun = false;
if (m_pThread != null && m_pThread.ThreadState == ThreadState.Running)
{
m_pThread.Abort();
}
}
}
}
```
这段代码中,我们使用一个线程不断随机移动点的位置,通过设置`m_bRun`变量来控制线程的运行状态,当窗口关闭时,通过`Thread.Abort()`方法结束线程运行。