кнопки не работают

Я новичок в программировании форм 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();

}

-1

Решение

Когда вы нажимаете кнопку, ваш код будет вводить этот фрагмент кода и не завершится, пока не будет сделано. Поэтому он не может обрабатывать нажатия на другие кнопки.
Решение проблемы может быть довольно сложным, поэтому я не буду вдаваться в подробности, я постараюсь помочь вам найти способ решить проблему самостоятельно.

Есть 2 способа сделать это (есть еще, но я поговорю об этих 2):

  • Многопоточность;
  • Очереди;

Многопоточность: Идея состоит в том, чтобы создать возможность для вашего кода быть в нескольких местах одновременно. Вместо того, чтобы делать все внутри функции кнопок, эта функция будет запускать только новый поток, который будет выполнять тяжелую работу. Это, вероятно, создаст проблемы, потому что вам придется беспокоиться о синхронизации, блокировках и беспорядке.

Очереди: Вероятно, проще реализовать эту многопоточность. Идея заключается в том, чтобы передать информацию, необходимую для вычисления, и нарисовать точки для некоторой переменной (подходящий стек). Это будет быстрая операция, и ваша программа сможет быстро выйти из функции кнопки. После этого в вашем основном цикле вам нужно будет реализовать что-то, что связано с информацией, которую вы сохранили в переменной стека. Просто будьте осторожны, чтобы не совершить одну и ту же ошибку, и попытайтесь обработать все это одновременно. Я предлагаю вам обработать пункт за пунктом если и только если с тех пор, как вы обработали последнюю точку, прошла секунда. Таким образом, вы получите то же поведение, что и сейчас, но без застревания.

0

Другие решения

Это потому, что у вас есть только один поток для обработки этих кнопок. Если ваш поток начинает выполнять этот цикл, который вы получили здесь, то этот поток не может делать что-либо еще, пока не будет завершен.

У вас есть несколько вариантов здесь.
Оптимизируйте этот код и посмотрите, нужно ли вам все это (только вы можете сказать).
Другой вариант — реализовать многопоточность для обработки этих функций. Но это потребует много работы, чтобы заставить его работать должным образом. Помните, что только один поток может обрабатывать пользовательский интерфейс, чтобы вы могли создать рабочий поток для вычисления значений и тому подобное. Проверь это
http://www.codeproject.com/Articles/540912/Cplusplus-Threads-Make-your-multitasking-life-e

0

По вопросам рекламы [email protected]