【发布时间】: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