计时器更新表单的问题
本文关键字:问题 表单 更新 计时器 | 更新日期: 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次,人眼是无法分辨出来的。