我如何在线程中运行mouse_move事件…

本文关键字:mouse move 事件 运行 线程 | 更新日期: 2023-09-27 18:05:08

我的应用程序从电子设备中绘制值。它在一秒钟内绘制10个值。它在获取下一个值之前等待100ms。等待是由Thread.Sleep(100);给出的,这部分工作良好。

我正在显示鼠标在MouseMove事件中的位置。但是为了显示这个位置,我需要延迟一下,我之前说过。

所以我想避免延迟。我试图在线程中运行MouseMove事件,如new Thread(chartControl1_MouseMove).Start();。但是它给出了以下错误:

  1. 匹配的最佳重载方法'System.Threading.Thread.Thread(System.Threading.ThreadStart)'有一些无效的参数。
  2. 参数'1':无法从'method group'转换为'System.Threading.ThreadStart'

什么建议…? ?

我如何在线程中运行mouse_move事件…

MouseMove事件接受一些参数。但是线程开始并没有传递它们。它假设该方法有void参数。

这是因为我采取的方法chartControl1_MouseMove被声明为

public void chartControl1_MouseMove(object sender,MouseEventArgs e)

不能转换为

形式的ThreadStart委托。
public delegate void ThreadStart()

要做到这一点,你需要创建一个自己的方法,返回类型为void,没有像

这样的参数。
private void foo()

并将代码行更改为:

new Thread(foo).Start();

这样至少可以编译。然后,您必须在foo方法中实现所需的行为。

您正在使用需要参数的方法。要么将方法更改为没有参数,要么使用工作项:

ThreadPool.QueueUserWorkItem(o => Method(m));

您需要将您的方法chartControl1_MouseMove(object sender, MouseEventArgs e)转换为包含一个参数的东西,或者您可以恢复使用任务代替。一般来说,最好将工作代码放在它自己的方法中,让事件就是事件(如果在表单中已经异步调用了)。然后从事件中调用工作方法(将其排队)。

使用线程池比使用线程有很多优点,参见这篇文章

使用parameterizedThreadStart或最好将mouse_move处理程序的主体移动到其他方法,并在线程上运行该方法