【问题标题】:Starting and pausing threads?启动和暂停线程?
【发布时间】:2013-02-10 00:02:01
【问题描述】:

我需要使用线程来暂停/恢复弹丸运动。在button3_Click 事件中,弹丸运动被绘制在屏幕上:

public void button3_Click(object sender, EventArgs e)
{
//... Lots of drawingcode...
}

我需要使用相同的button3_Click 暂停/恢复弹丸运动,但我是线程新手,不知道如何操作。

我试过了:

        public partial class Simulation : Form
{
            Thread parallel1;
            Thread parallel2;

            public Simulation()
            {
                InitializeComponent();
                parallel1 = new Thread(new ThreadStart(button3_Click));
            }
}

但我得到一个错误...

No overload for 'button3_Click' matches delegate 'System.Threading.ThreadStart'

我认为我需要两个线程,以便当一个暂停时,另一个正在运行以获取button3_Click 并恢复另一个线程。如何做到这一点?

【问题讨论】:

  • 如果您有名为 void Drawing() 的绘图代码方法并在 ThreadStart 中使用它,至少编译错误消失了...不要忘记在 parallel1 上调用 Start...但我猜你的下一个问题是你不能在非 UI 线程上调用 UI 相关的东西。
  • 答案似乎是我不能这样做,因为正如你所说,只有一个 UI 线程。真的很丢脸。
  • @user1920206 好吧,您可以随时使用Invoke 回帖到您的 UI 线程。但是,如果您只是想为某些东西制作动画,那么使用Timer 不是更好吗?
  • 你必须修改你的代码,看看你能不能把它分解成 UI 和非 UI 的东西(比如计算、获取数据等)。非 UI 的东西可以在单独的线程上完成。一旦完成并准备好单击按钮后,只需执行 UI 操作即可。您还可以查看是否可以优化 UI 的东西(你 double buffer?)。那么@bas的想法也是一个不错的建议。您将绘图分解为小任务,将它们存储在一个列表中,并在计时器的每个滴答声中执行一个小任务。
  • 旁注(主要针对未来的问题):您的问题不是很清楚“需要使用线程来...”是因为您有一些外部要求这样做还是您刚来有这个想法吗?说“我想将线程用于...”或“我想移动弹丸,我认为线程就是答案...”之类的话可以轻松区分这些情况。

标签: c# multithreading winforms events button


【解决方案1】:

这就是方法签名。在 c# 中,方法的参数和名称是唯一的。所以这个错误告诉你没有任何方法可以调用没有任何参数。你可以使用

new Thread( new ParameterizedThreadStart(...

您可以发送参数。 Sender 通常是您的按钮,您可以为 EventArgs 参数发送“new EventArgs()”。

但最好的方法(我使用它)不要在按钮单击中编写任何复杂的代码。用不同的方法编写复杂的代码,然后在按钮单击下调用它。通常操作会多次使用,因此您可以从任何地方调用您的方法而无需任何更改。 写一个新的方法来进行你的操作。如果您的方法中需要任何参数,您可以使用 parameterizedThreadStart 调用它。 请注意:如果您遇到任何类似这样的错误,一个或多个线程访问一个对象,您可以在线程启动之前设置此属性

CheckForIllegalThreadStart=false;

【讨论】:

  • 啊,我明白你的意思是 checkforillegalcrossthreadcalls。你觉得这样安全吗?如果您可以将其关闭,为什么会存在错误?你不怀疑这样的解决方案吗? (这是非常不安全的:stackoverflow.com/questions/2587930/…)。不要那样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多