【问题标题】:make a rectangle move in a different thread? [closed]使矩形在不同的线程中移动? [关闭]
【发布时间】:2018-02-19 11:44:49
【问题描述】:
public partial class Form4 : Form
{

    int x, y = 10;

    Graphics g;

    public Form4()
    {
        InitializeComponent();
    }

    private void Form4_Load(object sender, EventArgs e)
    {
        g = this.CreateGraphics();

        System.Threading.Thread th = new System.Threading.Thread(threadmethod);

        th.Start();            
    }

    void threadmethod()
    {
        Timer t = new Timer();
        t.Enabled = true;
        t.Interval = 100;
        t.Tick += T_Tick;
    }

    private void T_Tick(object sender, EventArgs e)
    {
        g.DrawRectangle(new Pen(Brushes.Blue), new Rectangle(x++, y++, 20, 20));
    }
}

当此代码在没有线程的情况下运行时,矩形会被动画化。但是此代码中没有动画或绘制矩形。请让我知道我应该做出的改变

【问题讨论】:

  • 你不知道如何做多线程不是你的错。但是 Stack Overflow 不再是学习任何东西的地方,除非它是一个简单的问题,具有明确定义的范围,能够提供简单的答案。您需要的是 C# 中的多线程教程,因此请尝试在 youtube 上搜索。或者上大学并支付自己的教育费用。
  • @PeterWone “但是 Stack Overflow 不是学习的地方,”我强烈反对。此外,我真的不明白反对意见。 “除非这是一个简单的问题,具有明确定义的范围,能够提供简单的答案。”看帖子。它拥有人们需要的一切。 1) 一个范围明确的简单问题。它具有重现问题的完整代码。只需按照要求复制粘贴即可。它本身就是Minimal, Complete, and Verifiable example
  • @PeterWone 和 2)“明确定义的范围,能够提供简单的答案。” => 答案相当简单。使用 360 个字符,您可以为这个问题写下一个合理的答案,而不是建议 OP“上大学并为自己的教育付费。”
  • @PeterWone 我在这里唯一同意你的一点是,这表明研究非常缺乏。确实如此。但是这个问题在这里既不是不合适的,也不是太宽泛了。

标签: c# .net multithreading timer


【解决方案1】:

您使用了错误的计时器。 System.Windows.Forms.Timer 在 UI 线程上运行。

此 Windows 计时器专为使用 UI 线程执行处理的单线程环境而设计。

您的矩形未绘制,因为Tick 事件从未触发!

解决方案:改用一个在后台运行的计时器:

System.Timers.Timer 是可能的候选人。将我们的代码简单地更改为:

void threadmethod()
{
    System.Timers.Timer t = new System.Timers.Timer();
    t.Enabled = true;
    t.Interval = 100;
    t.Elapsed += T_Tick;
    t.AutoReset = true;
}

其余的可以保持原样,你可以看到你的蓝色矩形在你的 GUI 表面上蔓延

【讨论】:

  • 谢谢。有效。 :)
【解决方案2】:

认为你的线程不知道 UI 线程,你需要调用你的绘图方法到 UI 线程。比如:

App.Current.Dispatcher.Invoke(() => { g.DrawRectangle(new Pen(Brushes.Blue), 
new Rectangle(x++, y++, 20, 20)); });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多