На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
[!] Как относитесь к модерированию на этом форуме? Выскажите свое мнение здесь
  
> Canvas does not allow drawing
    Здравствуйте!
    Тема, наверное, WinAPI-шная, но вызовы идут из программы на Билдере - потому тут и пишу.
    Пока моя рисовалка работала с одной картой, проблем не было. А сейчас рухает с сообщением
    ExpandedWrap disabled
      void __fastcall TFMain::AppException(TObject *Sender, Exception *E) {
        Screen->Cursor = crDefault;
        if (onSxfLoad) {
          sprintf(buf, "Файл %s\r\nОшибка на объекте %d:%d:", OpenDialog1->FileName, sxfItem->api->MapObj->code, sxfItem->api->MapObj->num);
          switch (sxfItem->api->MapObj->local) {
            case  0 : strcat(buf, "LIN"); break;
            case  1 : strcat(buf, "SQR"); break;
            case  2 : strcat(buf, "DOT"); break;
            case  3 : strcat(buf, "TXT"); break;
            case  4 : strcat(buf, "VEC"); break;
            case  5 : strcat(buf, "MIX"); break;
            default : strcat(buf, "UFO"); break;
          }
          strcat(buf, "\r\n");
          strcat(buf, E->Message.c_str());
          Application->MessageBox(buf, "Ошибка чтения файла", MB_ICONWARNING);
        }
        else {
          ShowMessage(E->Message.c_str());  // вот сюда попадаю
          Application->Terminate();
      } }
    Рухает после загрузки примерно 20 карт в OnPaint пейнтбокса, на который выводится БМП:
    ExpandedWrap disabled
      void __fastcall TFMain::PBPaint(TObject *Sender) {
        PB->Canvas->Draw(0, 0, bmp);
      }
    Куда рыть? Проверить, всем ли SelectObject() есть соответствующие DeleteObject()? Или тут что-то другое? :(
      поток я так понимаю у тебя один, поэтому скорее всего что то из этого ;)
      Цитата
      Question:
      What does the error message 'Canvas does not allow drawing' mean?
      Answer:
      you may have run out of resources, which means a new DC cannot be allocated. Usually this is a result of not freeing unused DCs or other objects.
      you are attempting to draw to an device context that is not yet valid. Such as in the create constructor of a component.
      you are trying to draw on a canvas while your last draw-operation has not finished yet. In this case you can use Canvas.Lock() or Canvas.TryLock() to fix it.
      Сообщение отредактировано: popsa -
        Цитата #SI# @
        Проверить, всем ли SelectObject() есть соответствующие DeleteObject()?

        Интересно, а зачем вообще их понадобилось юзать. Чем VCL-ные обертки не устраивают, или хочется создать "гремучую смесь" VCL и API ?! :)
          leo, научи, как висюльками нарисовать PolyPolygon() и выполнить TransparentBlt(). Ну шо те стоит, а? :)
          Да, и заодно как такое пёрышко создать?
          user posted image
          ---
          По сабжу - поотключал часть функций рисовалки, загрузил 61 карту сотки на Московскую область. Полёт нормальный. Это говорит о том, шо где-то в отключенных функциях порылась собака.
          Сообщение отредактировано: #SI# -
            Цитата #SI# @
            Да, и заодно как такое пёрышко создать?

            Не понятно, чем ты вообще занимаешься - хочешь слепить свою самоделку лучше или дешевле, чем Панорама ГИС-вьюер ?! ;)
              leo, ты по делу можешь ответить? Если нет - то не парься, ага? А с поделками этой конторы я знаком не понаслышке... :whistle:
              ---
              По сабжу - нашёл пяток косяков, исправил. Но вывод полигонов всё равно глючит. Тот же глюк, шо и в вышеупомянутой Панораме - только там EAV не обрабатывается и писюк не поднимается даже тремя пальцами. Вот пример вывода:
              ExpandedWrap disabled
                  switch (obj->code) {
                    //.....
                    case 71323000 : pen = ::CreatePen(PS_SOLID, 1, clBlack);
                                    logBrush.lbStyle = BS_HATCHED;
                                    logBrush.lbColor = clBlack;
                                    logBrush.lbHatch = HS_CROSS;
                                    brush = ::CreateBrushIndirect(&logBrush);
                                    DrawPolygon(hdc, points, pointCount, metricCount, pen, brush);
                                    return;
                    //-----------------------------------------------------------------------
                    case 71610000 : pen = ::CreatePen(PS_DASH, 1, clBlack);
                                    brush = ::CreateSolidBrush(clWhite);
                                    DrawPolygon(hdc, points, pointCount, metricCount, pen, brush);
                                    return;
                    //=======================================================================
                    default       : // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                                    pen = ::CreatePen(PS_SOLID, 1, clFuchsia);
                                    brush = ::CreateSolidBrush(clFuchsia);
                                    DrawPolygon(hdc, points, pointCount, metricCount, pen, brush);
                                    return;
                } }

              А вот вывод полигона:
              ExpandedWrap disabled
                void DrawPolygon(HDC dc, TPoint *pnts, int *pCount, int mCount, HPEN pen, HBRUSH brush) {
                  HPEN dcPen = ::SelectObject(dc, pen);
                  HBRUSH dcBrush = ::SelectObject(dc, brush);
                  ::PolyPolygon(dc, pnts, pCount, mCount);
                  ::SelectObject(dc, dcPen);
                  ::DeleteObject(pen);
                  ::SelectObject(dc, dcBrush);
                  ::DeleteObject(brush);
                }
              Причем когда искусственно устанавливаю коды в 0 и вывожу по дефолту - проблем нет! Такое впечатление, что глюк идёт из-за вызовов CreateBrushIndirect() :wall:
              Кстати, щяс в дефолт подставлю её и посмотрю что получится.
              ---
              ExpandedWrap disabled
                    default       :
                                    pen = ::CreatePen(PS_SOLID, 1, clFuchsia);
                //                    brush = ::CreateSolidBrush(clFuchsia);
                                    logBrush.lbStyle = BS_HATCHED;
                                    logBrush.lbColor = clBlack;
                                    logBrush.lbHatch = HS_CROSS;
                                    brush = ::CreateBrushIndirect(&logBrush);
                                    DrawPolygon(hdc, points, pointCount, metricCount, pen, brush);
                                    return;
              Всё ОК... Пошёл рыцца дальше...
              ---
              Всё ещё роюсь... Круг поиска сузился...
              ЗЫ - ещё одна Панорамная фенька - если работает тот же плейер, то в момент загрузки карты звук просто заикается. Очень смешно... :ph34r:
              ---
              Поймал хаду! Громко не ржать!
              ExpandedWrap disabled
                                      // плотнозастроенные
                                      case  1 : value = GetAtrValue(atrs, 243);
                                                switch (value) {
                                                  // крупный город
                                                  case 20 : brush = ::CreateSolidBrush(RGB(255, 148, 40)); // жёлтенькие
                                                            break;
                                                  // малый город, ПГТ
                                                  case 21 :
                                                  case 22 : brush = ::CreateSolidBrush(LTGRAY_BRUSH);
                                                            break;
                                                  // с/х и дачные посёлки
                                                  case 23 :
                                                  case 24 : brush = ::CreateSolidBrush(BLACK_BRUSH);
                                                            break;
                                                  // прочие НП
                                                  case 26 : brush = ::CreateSolidBrush(BLACK_BRUSH);
                                                            break;
                                                  // любые НП
                /* а кисти - нет */               case 28 : ::CreateSolidBrush(RGB(255, 148, 40)); // жёлтенькие
                                                            break;
                /* -*- */                         default : ::CreateSolidBrush(RGB(255, 0, 0));    // UFO
                                                }
                                                break;

              Всем спасибо за внимание!
              ЗЫ - этой баге года 2, не меньше. Пока работал с одной картой - всё сходило с рук...
              ЗЗЫ - Лео, ежели кинет тебя судьба и заставит писать на Панорамных MapAPI / GTK - спрашивай, не стесняйся. Чем смогу - помогу! :yes:
              Сообщение отредактировано: #SI# -
                :offtop:
                Цитата #SI# @
                Лео, ежели кинет тебя судьба и заставит писать на Панорамных MapAPI / GTK - спрашивай, не стесняйся. Чем смогу - помогу!

                :lool: "Эт вряд ли"(С). "Не царское это дело" заниматься какими-то рисовалками, поэтому "помощников" мне и так хватает, и не они мне советуют что и как делать, а я им "с высоты птичьего полета", поскольку прежде чем грузить "61 карту сотки на Московскую область" нужно подумать - а нужно ли это вообще и можно ли решить эту задачу иначе ;)
                  Цитата leo @
                  а я им "с высоты птичьего полета"
                  Штаны не потеряй. Давай ты будешь своим делом заниматься, а я - своим. И помогать друг другу. А по части флудежа в тематике тебе всё равно за мной не угнацца. Не веришь - спроси тутошних модераторов. Они много чего могут вспомнить :tong:

                  Добавлено
                  ---
                  А вопрос таки решён. :D
                    Цитата #SI# @
                    Давай ты будешь своим делом заниматься

                    Я своим и занимаюсь - пытаюсь обратить внимание на то, что, возможно, вы НЕ "верной дорогой идете, товарисч!" ;) В предыдущем топике ты пытался параллельно рисовать 4-5 карт в разных потоках - видимо есть какие-то проблемы с быстродействием. Теперь речь зашла об отрисовке 20-60 карт и возникли вопросы с нехваткой ресурсов. Хотя судя по этой картинке, уже при отображении 3-4 листов одновременно, разобрать что-либо на такой с позволения сказать "карте" практически невозможно - тут явно нужна генерализация. Поэтому если и юзать многопоточность, то не для того, чтобы параллельно рисовать "кашу" на экране, а создавать\обновлять прореженный список\списки генерализованных объектов, которые следует отображать в мелких масштабах. И если кол-во одноврменно отображаемых объектов при разных мелких масштабах будет примерно одинаковым (или хотя бы будет отличаться раза в 2-3, а не в сотни раз), и ссылки на отображаемые объекты будут занесены в отдельный список (чтобы не искать их по всем картам при каждой перерисовке), то и основному потоку будет практически пофиг рисовать одну подробную карту или 60 мелких генерализованных. (Ну и ес-но одна мелкая схематическая карта-навигатор на весь район - штука весьма полезная).
                    Хотя ты, видимо, и сам все это знаешь, поэтому - "извиняйте за беспокойство, не смею больше тревожить" ;)
                      Да простят меня модеры за забивание форума картинками...
                      user posted image

                      user posted image

                      user posted image

                      user posted image

                      Потенциальная банка за наезд на участника форума
                      Мил человек, не рассказывай мне, как делаются ГИСы. Я этим занимался ещё тогда, когда ты штаны мочил... Ничего личного. Ага. Не надо считать собеседников дебилами.
                      ---
                      По сабжу - я действительно не работал с потоками для такого конкретного случая. Таки, положа руку на сердце, от тебя ничего, окромя высокозаумного мычания, я не услышал.

                      ---
                      ЗЫ - таки багу я нашёл. Исправил. Отписал тут чуть выше. Искренне желаю ребятам, которые в глаза излучают тебе улыбки, а за глаза ... не попадать в такие ситуации. :yes:

                      Добавлено
                      Таки для поклонников поделок КБ Панорама (сорри за качество, но клаву она при ошибке блокирует, снимал мобилкой):
                      user posted image

                      user posted image

                      Вопрос к МАСТЕРАМ уровня Адиля/Тренера (в алфавитном порядке :) ) - чем так можно засрать память, что система просто не реагирует?
                      Сообщение отредактировано: #SI# -
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0749 ]   [ 16 queries used ]   [ Generated: 11.11.25, 02:02 GMT ]