singlepost

С# Бесконечный цикл ='( << На главную или назад  

Как можно остановить бесконечный процесс рисования фигур в клиентской области по команде меню, к примеру?

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

53 ответов в теме “С# Бесконечный цикл ='(”

  1. 21
    Арбалет Арбалетович ответил:

    почитай книгу Компьютерная графика, мультимедиа и игры на Visual C# 2005. Жарков там есть про Graphics довольно много.

  2. 20
    Павел Потапов ответил:

    Надо по таймеру вызывать перерисовку экрана.

    По нажатию одного пункта меню запускать этот таймер, другого – останавливать.

    И никаких потоков, бесконечных циклов и чего-то более сложного не надо.

    ЗЫ Да, и rand желательно хранить в переменной.

  3. 19
    Евгений Баталов ответил:

    Чет чую все эти DoEvents & ProcessMessages будут отставать от действий пользователя и эффект "торможения" все-таки немного будет. Свои вариант предложить не могу.

  4. 18
    Петр Рогов ответил:

    можно было тупо запихать в цикл DoEvents() ;)

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

  5. 17
    Денис Боенсков ответил:

    Вот потому и "поток – хреновая идея"…. Как вариант: отрисовывать изображение в памяти, а в основном потоке периодически скидывать на форму. (Не забывая про блокировки)

  6. 16
    Михаил Асташкевич ответил:

    VCL – однопоточная библиотека.

  7. 15
    Ольга Павлова ответил:

    хм. Тогда ещё один вопрос: как правильно получать в потоке контекст отображения Graphics?

    Graphics g = Graphics.FromHwnd(this.Handle);
    "попытка доступа к элементу "Form1" не из того потока, в котором он был создан"

  8. 14
    Владимир Муромский ответил:

    а с ним не нужно разбираться, его мощно просто в цикл вставить:) Только он довольно сильно будет его замедлять, поэтому можно вызывать его скажем раз в 1000 циклов

  9. 13
    Ольга Павлова ответил:

    C потоками всё удалось =) Спасибо ) Как-нибудь разберусь в Process Messages ))

  10. 12
    Андрей Горбоконь ответил:

    System.Threading.Thread

  11. 11
    Андрей Щипцов ответил:

    о как… ну да…. прога зависнет и кнопочку ты нажать, естесственно, не сможешь… ну как вариант(если скорость сильной роли не играет) то можнно цикл в таймер затолкать… поставить 1 мс интервал. и включать и выключать его…

  12. 10
    Андрей Щипцов ответил:

    опередил)) читаешь мысли))

  13. 9
    Ольга Павлова ответил:

    )))

  14. 8
    Денис Боенсков ответил:

    Ну тут или действительно поток (threads погугли) или в BCB есть функция ProcessMessages (там, кажись, простенький вызов APIшных ф-ций), которая позволяет обработать очередь сообщений (выбор пункта меню).

    PS(подумав)… хотя….. поток – хреновая идея, ProcessMessages рулит

  15. 7
    Ольга Павлова ответил:

    На самом примитивном уровне:

    public bool flag=false;

    private void risovanieToolStripMenuItem_Click(object sender, EventArgs e)
    {
    flag = true;
    Graphics g = Graphics.FromHwnd(this.Handle);
    int x, y,razmer,r,gr,b;
    Random rand = new Random();
    for (;;)
    {
    razmer = rand.Next(0, 500);
    x = rand.Next(0, this.Width-razmer/2);
    y = rand.Next(0, this.Height+razmer/2);
    r = rand.Next(0, 255);
    gr = rand.Next(0, 255);
    b = rand.Next(0, 255);
    System.Threading.Thread.Sleep(50);
    g.FillEllipse(new SolidBrush(Color.FromArgb(255, r, gr, b)), x, y, razmer, razmer);
    if (flag == false) break;
    }
    }

    private void stopToolStripMenuItem_Click(object sender, EventArgs e)
    {
    flag = false;
    }

  16. 6
    Ольга Павлова ответил:

    Может, что-нибудь хитрое с таймером сделать?

  17. 5
    Ольга Павлова ответил:

    Андрей [Sn0Xx] Щипцов, боюсь, что нет. if (flag == false) break; – не работает, так как до изменения переменной flag дело не доходит

  18. 4
    Андрей Щипцов ответил:

    эмм… а выложи цикл что ль…

  19. 3
    Михаил Асташкевич ответил:

    Может можно создать поток и в нем этот цикл крутить?

  20. 2
    Андрей Щипцов ответил:

    может я что – то не догоняю, а команда break не подойдет?…

  21. 1
    Ольга Павлова ответил:

    Хмм)) А где можно про поток прочитать? А то в C# совсем недавно =(

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.