1. C++ / Говнокод #3139

    +89

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    void __fastcall TForm1::FormPaint(TObject *Sender)
    {
      for(int i=0;i<2;i++)
      {
        if(!White[i].Moves)
        {
          int j=0;
          for(int k=0;k<i;k++)
          {
            if(White[k].Position == White[i].Position)
            {
              j++;
            }
          }
          Image1->Canvas->MoveTo(Points[White[i].Position-1].X-20,Points[White[i].Position-1].Y - 30*j);
          Image1->Canvas->LineTo(Points[White[i].Position-1].X+20,Points[White[i].Position-1].Y - 30*j);
        }
      }
      //Image1->Canvas->LineTo(200,200);
    }

    Этот обработчик грузит проц. на 50 процентов и таймер не работает из-за него.
    Писал мой знакомый, который не любит продукты от борланда.
    В чем дерьмо? Думаю видно невооруженным глазом.

    Запостил: fenryr, 30 Апреля 2010

    Комментарии (59) RSS

    • в борланде?
      Ответить
      • А если не плясать на костях умершего? а по сабжу
        Ответить
    • школота, опять.
      Ответить
    • Блин... Мне показалось, что это Дельфи... Вот лопух...
      Ответить
    • Вообщем коли VCL написано на делфи
      и не имеет отношения к с++, тогда:
      если убрать

      Image1->Canvas->MoveTo(Points[White[i].Position-1].X-20,Points[White[i].Position-1].Y - 30*j);
      Image1->Canvas->LineTo(Points[White[i].Position-1].X+20,Points[White[i].Position-1].Y - 30*j);

      то все нормально будет
      Ответить
      • Тоесть тормозять дельфовские части?
        Ответить
      • Тормозит отрисовка? Или то, что там на самом деле идёт хитрое обращение к свойствам?
        Ответить
      • и в чём юмор? дельфи не осиливает отрисовать две линии за одно WM_PAINT? круто
        Ответить
        • ну "Image1" как бы есть подсказка что рисуется в картинку, а не напрямую на экран. и если это весь код, ничего для краткости не было вырезано, то на экран вообще не выводится ничего.

          (Коррекция: Image1 скорее всего есть объект картинки который на форму кидается. В этом случае рисование в картинку может тоже WM_PAINT генерировать, т.к. Image в VCL не есть контрол и рисуется парент контролом, например самой формой.)

          из-за убогости VCL реально быстро WM_PAINT обработать почти никогда не получается. VCL это все перекрывает и в процессе теряет маску перересовки: определить какую часть окна/контрола надо реально перерисовать невозможно - приходится рисовать все. мои знакомые не на одном проекты OnPaint() хакали (обработчик WM_PAINT) что бы быстро что-то перерисовывать (куча гамновой работы бо тогда VCLные штучки нельзя использовать и надо все ручками на WinAPI делать).
          Ответить
      • Вообще странно:
        Image1->Canvas->MoveTo(Points[White[i].Position-1].X-20,Points[White[i].Position-1].Y - 30*j);
        Image1->Canvas->LineTo(Points[White[i].Position-1].X+20,Points[White[i].Position-1].Y - 30*j);
        Вызывается не сто тысяч раз, а лишь:
        for(int i=0;i<2;i++)
        Недолжно оно так тормозить.
        Ответить
    • Где здесь Стрикер?
      Ответить
    • наверное памяти было жалко на отдельную переменную, действительно лучше стотыщ раз обратиться к оператору индекса
      pt = Points[White[i].Position-1];
      Image1->Canvas->MoveTo(pt.X-20,pt.Y - 30*j);
      Image1->Canvas->LineTo(pt.X+20,pt.Y - 30*j);
      Ответить
      • хаха, говнокодеры из Борланда не слышали о common subexpression elimination?

        даже в Майкрософте слышали
        Ответить
      • Между прочем, вполне можно было-бы закэшировать.
        Ответить
        • Так, что здесь борланд тоже говнокодеры.
          Ответить
        • низя кешировать - выражения считаются между системными вызовами - значит, могут измениться значения операндов.
          Ответить
          • Вообще, если во время расчета вышележащей формулы поменяются значения цветов в данных точках, то результат расчёта будет отличатся от ожидаемого.
            Ответить
          • Здравствуйте! Извините за нескромный вопрос, Вы итальянец или грузин?
            Ответить
    • Ну вообщем при вызове
      Image1->Canvas->LineTo(Points[White[i].Position-1].X+20,Points[White[i].Position-1].Y - 30*j);
      идет отправка WM_PAINT окну и следовательно процедура вызывается FormPaint непрерывно.
      Вот такая хрень.
      Ответить
      • не верю
        Ответить
      • Только что проверил. LineTo не вызывает FormPaint. Может вызовы свойст вызывают, я не знаю. Короче, нех пиздеть.
        Ответить
    • проверил в дотнете, такого безобразия нет

      private void Form1_Paint(object sender, PaintEventArgs e)
      {
      pictureBox1.CreateGraphics().DrawRectang le(Pens.Red, new Rectangle(10, 10, 50, 50));
      }

      так что наверное у борланда непродуманно в этом плане.
      Ответить
      • ага, GdipDrawRectanglesI окну WM_PAINT не шлёт (в вайне не шлёт)
        Ответить
    • показать все, что скрытоВсе, кто сидит 1 мая на говнокоде и срут - типичные Пидоры-ГдеЗдесьСиПлюсПлюсовцы-Задроты. Нормальные люди в это время празднуют.
      Ответить
      • раз уж ты тут насрал то и к тебе это тоже относится
        Ответить
        • Я только что заглянул, в отличии от тебя, который сидит здесь целый день.
          Ответить
      • ололо
        Ответить
      • Пусть ветер дует тебе в спину.
        Убирайся с ресурса.
        Ответить
      • "Первомай празднуют две трети россиян‎"

        Ты входишь в 95%!

        Алсо, срал я на праздник коммунистов.
        Ответить
        • дерьмократ?
          Ответить
          • Да, социал-демократ.

            Не путай с капитал-демократами типа США, тупое быдло.
            Ответить
            • Типо палитикан, да?
              А сам то со своими единоросами и фашистами.
              Ответить
              • олололо
                Ответить
              • Не путай с суверенной демократией тоже.

                И почему сразу политикан? В странах, где люди не скатываются в говно, это вполне в порядке вещей - иметь активную социальную позицию.
                Ответить
              • Где здесь php7?
                Ответить
            • Хорошо, хоть не национал-социалист. И на том славно.
              Ответить
      • Вижу, что ты единоросовец С++ник.
        Ответить
        • Меня вообще эти единоросовцы бесят. Устроили однопартийную систему, а путин свой трон по наследству передаёт.
          Ответить
          • R.I.P.
            Ответить
          • К вам уже выехал отряд Амона. Никуда не уходите.
            Ответить
            • Может, Амона Ра?
              Ответить
              • Как думаете, что он делает?
                [url]http://vecherka.su/pics/uploads/archive2007/06_2007/04062007/02.jpg[/url]
                PS: Руки в заде - для маскировки.
                Ответить
      • а помоему ты пиздоглазое мудило раз решил заострить на этом внимание. *пишу с шашлыков по ГПРС*
        Ответить
    • Плювок в сторону С++.
      Ответить
    • for(int k=0;k<i;k++)
      дело в этой строке ведь?
      Ответить
    • это борланд и это Билдер С++. а таймер ваш там какой-т не работает - ставьте в цикле application -> processmessages; да и вообще это на формпайнт... жесть, это вообще работает?
      Ответить
      • Да, кстати. Если не отрабатывать после отрисовки сообщения, фактически, разрешение обработать то, что нарисовалось, вполне может аццки тормозить. Инфа 100%.
        Камрад, жму руку.
        Ответить
    • Гонево все! Раз написано fastcall, значит, вызываться будет быстро =:P
      Ответить
    • - Русланчик, мы обязательно сходим в следующий раз.
      Ответить

    Добавить комментарий