按钮不起作用

buttons do not function

本文关键字:不起作用 按钮      更新时间:2023-10-16

我是 c++ windows 表单编程的新手。我设计了一个具有 5 个按钮和 5 个图形的窗口窗体。当按下任何屁股时,在相应的图形中绘制 100 个随机值。一切都运行良好,除非绘制值时没有其他按钮工作。我创建了一个 for 循环,它循环 100 次并在特定图中绘制随机生成的值。但是,当绘制一个图形时,没有其他按钮工作。我实际上想创建一个开始和停止按钮,以便当按下开始对接时,绘图开始,当按下停止时,绘图停止。提前谢谢。

按钮的代码如下

private: System::Void btn1_Click(System::Object^  sender, System::EventArgs^  e) {
             for (z = 0; z < 100; z++)
             {
                 y = rand() % 8 + 1;
                 x = rangeMax;
                 //plot data
                 gp1->PlotXY(x, y, 0);
                 //display lable
                 dis1->Text = Convert::ToString(y);
                 dis1->Update();
                 ctr++;
                 Sleep(1);
                 if (ctr == 1)
                 {
                     rangeMin = rangeMin + 0.2;
                     rangeMax = rangeMax + 0.2;
                     gp1->SetRange(rangeMin, rangeMax, 0, 10);
                     gp1->XGridNumber::set(100);
                     gp1->YGridNumber::set(10);
                     ctr = 0;
                 }
                 gp1->Update();
             }

当您单击该按钮时,您的代码将进入这段代码,并且在完成之前不会退出。因此,它无法处理其他按钮上的单击。解决问题可能相当棘手,所以我不会在这里详细介绍,我会尽力帮助您找到自己解决问题的方法。

有两种方法可以做到这一点(还有更多,但我会谈谈这 2 种):

  • 多线程;
  • 队列;

多线程:这个想法是为您的代码同时位于多个位置创造可能性。此函数不会在按钮函数中执行所有操作,而是只会启动一个将完成艰苦工作的新线程。这可能会产生问题,因为您将不得不担心同步,死锁和混乱的东西。

队列:可能更容易实现这种多线程。它背后的想法是将您需要计算和绘制点的信息推送到某个变量(堆栈是合适的)。这将是一个快速的操作,您的程序将能够快速退出按钮功能。之后,在您的主循环中,您将必须实现一些处理您保存到堆栈变量的信息的东西。只是要小心不要犯同样的错误,并尝试同时处理它。我建议您逐点处理,当且仅当自处理最后一个点以来已经过去了一秒钟。这样,您将获得与现在相同的行为,但不会卡住。

这是因为您只有一个线程来处理这些按钮。如果你的线程开始运行你在这里得到的这个循环,那么这个线程在完成之前不能做任何其他事情。

您在这里有几个选择。优化此代码,看看您是否真的需要所有这些代码(只有您才能知道)。另一种选择是实现多线程来处理这些功能。但这需要大量的工作才能使其正常工作。请记住,只有一个线程可以处理 UI,因此您可以创建一个工作线程来计算值等。看看这个http://www.codeproject.com/Articles/540912/Cplusplus-Threads-Make-your-multitasking-life-e