我是c ++ windows form编程的新手。我设计了一个窗体,有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();
}
答案 0 :(得分:0)
当您单击该按钮时,您的代码将输入此代码,并且在完成之前不会退出。因此它无法处理其他按钮上的点击。 解决这个问题可能非常棘手,所以我不会在这里详细介绍,我会尽力帮助你找到解决问题的方法。
有两种方法可以做到(有更多,但我会谈论这些2):
多线程:这样做的目的是为您的代码创建同时位于多个位置的可能性。而不是在按钮功能中执行所有操作,此功能将仅启动将执行艰苦工作的新线程。这可能会产生问题,因为你不得不担心同步,死锁和杂乱的东西。
队列:可能更容易实现多线程。它背后的想法是推送您需要计算的信息并将点绘制到某个变量(堆栈是合适的)。这将是一个快速操作,您的程序将能够快速退出按钮功能。之后,在主循环中,您将必须实现一些处理您保存到堆栈变量的信息。小心不要犯同样的错误,并尝试同时处理所有错误。我建议您逐点处理当且仅当在您处理完最后一点后已经过了一秒钟。通过这种方式,您将获得与现在相同的行为,但不会被卡住。
答案 1 :(得分:0)
这是因为您只有一个线程来处理这些按钮。如果你的线程开始运行这个循环你到这里然后这个线程不能做任何其他事情直到它完成。
你有几个选择。 优化此代码,看看你是否真的需要它(只有你可以告诉)。 另一种选择是实现多线程来处理这些功能。但这需要很多工作才能使其正常工作。请记住,只有一个线程可以处理UI,因此您可以创建一个工作线程来计算值等。看一下这个 http://www.codeproject.com/Articles/540912/Cplusplus-Threads-Make-your-multitasking-life-e