计时器更新表单的问题

本文关键字:问题 表单 更新 计时器 | 更新日期: 2023-09-27 18:17:33

我有一个递归函数,我想用时间、尝试次数和递归函数的当前尝试来更新表单。每一秒钟,表单应该更新一次。当前的方法调用器不起作用。编译器将突出显示该行,但不会继续,它将弹出。

我已经试过把函数放在一个单独的线程上,但是,它表现得很差,所以我更愿意把函数放在主线程上。

任何想法?

void bruteForce_DoWork()
{
   doBruteForceEID("", 0, wordlen, temp);
}
void _myTimer_Elapsed(object sender, ElapsedEventArgs e)
{
    if (InvokeRequired)
    {
        runTimeSec++;
        this.Invoke(new MethodInvoker(delegate() { this.toolStrip.Text = "Running... " + runTimeSec + "s"; }));
        Invoke(new MethodInvoker(delegate() { lblAttackA.Text = Convert.ToString(attackCount); }));
        Invoke(new MethodInvoker(delegate { lblCurAttempt.Text = brute; }));
    }
    else
    {
        runTimeSec++;
        toolStrip.Text = "Running... " + runTimeSec + "s";
        lblAttackA.Text = Convert.ToString(attackCount);
        lblCurAttempt.Text = brute;
    }
}
编辑:让我再解释一下这个程序…一旦用户输入了他们想要检查的密码,点击Calculate后会发生以下操作。-运行一个虚拟递归算法,看看他们的机器在5秒内可以做多少个循环,然后我平均它们,以便更好地了解他们每秒可以做多少个循环。
            back = new Thread(new ThreadStart(testLoop_DoWork)); // Calls the dummy algorithm
            back.Start();
            if (rbtnTest.Checked)
            {
                txtEID.Text = txtUID.Text;
                lblRunCycle.Text = "Calculating...";
                testTimer.Enabled = true;  // Starts the Timer 
            }

一旦5秒定时器是起来,我检查长度,周期每秒,什么字符(上,下,数字,符号),给多长时间将需要,添加相应的字符数组创建的暴力字符数组,然后我Join()线程和禁用定时器。我大概会得到每秒700万次循环…(记住这个数字)。此外,我在这段时间没有更新到GUI ..正在运行创建的线程。

如果用户想要运行攻击,它就会运行:

        attackBack = new Thread(new ThreadStart(bruteForce_DoWork));
        attackBack.Start();
        _myTimer.Enabled = true;

一旦我开始在新线程上运行它,它每秒只显示大约30,000个周期??我的计时器每秒钟更新一次。发生了什么事?

编辑:我也只是注释了定时器,所以没有更新到GUI…当发现蛮力时也会出现相同的结果(例如,单词"test"应该是即时的……但是需要10秒才能找到它

计时器更新表单的问题

是的,这不能工作。计时器。经过的事件在线程池线程上运行。这意味着invokerrequired总是为真,不需要检查。不能工作的是Invoke()调用。它要求UI线程处于空闲状态,这样它才能执行被调用的代码。

你的UI线程不是空闲的,它正在执行昂贵的代码。这叫做死锁。

做这件事的另一种方式,有一个工作线程执行昂贵的代码,而不是UI线程。它保持UI线程响应,更新标签,保持UI绘制和响应用户输入。你说你不喜欢这样做,不清楚为什么你有问题。一个典型的错误是过于频繁地更新UI,使其充斥着调用请求,因此它无法再履行其常规职责。定时更新确实是解决方案。永远不要超过每秒25次更新,如果你更新的次数超过25次,人眼是无法分辨出来的。