2014-11-15 2 views
-1

Я новичок в программировании на языке C++. Я разработал форму окна, которая имеет 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

Вам действительно нужно предоставить больше информации, как в исходном коде, так и для нас, чтобы помочь нам. – Till

+0

Я добавил код .. когда я нажимаю кнопку, с вышеупомянутым кодом, никакие другие кнопки не работают до тех пор, пока цикл, упомянутый выше, не завершится. – hp26

+0

Это ожидаемое поведение. Я имею в виду, что когда вы будете обрабатывать в своем потоке графического интерфейса, он будет блокироваться до завершения обработки. – drescherjm

ответ

0

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

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

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

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

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

0

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

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

Смежные вопросы