// изначально
//f_left=f_top=0;f_width=f_height=19;
//src.left=src.top=0;src.right=src.bottom=19;
void Decode(void)
{
int id, id16;
//начинаем с верхнего левого угла
f_left = 0;
f_top = 0;
//по 16 битмэпов на 1 "строке"
id16 = 0;
for( id = 0 ; id < 512 ; id++ )
{
if( id16 == 16 )
{
id16 = 0;
f_top += f_height;
f_left = 0;
}
dest.top = f_top;
dest.left = f_left;
dest.right = dest.left + f_width;
dest.bottom = dest.top + f_height;
bit->Canvas->CopyMode = cmSrcCopy;
bit->Canvas->CopyRect( dest, blackbit[ mybuf[ id ] ]->Canvas , src );
f_left += f_width;
id16++;
}
NavyPanel->pb->Canvas->Draw( 0 ,0, bit );
}
Canvas умеет так быстро?
Что есть:
Есть 2 потока. 1-й для гуи, второй для обмена данными и их отрисовки. Форма(NavyPanel), на которой все рисуется, запускается в 1 потоке. На форме находится PaintBox(pb), на канве которого и происходит отрисовка. Есть массив из 512 маленьких картинок Bitmap( blackbit[]). Все картинки 19*19 пикселей. Выбор индекса картинки задается из массива int mybuf[512]. Во 2 потоке они с периодом Х наносяться на внеэкранный Bitmap(bit). bit имеет разmep 300*500. А затем bit разом отрисовывается на pb. pb имеет размер 350*585.
Отрезок кода из второго потока:
Код:
Проблема:
Функция определенное число раз(я его не знаю) отрисовывает на канве пэйнт бокса все нормально, но в какой-то момент изображение как бы застывает(при этом 2 поток работает и Decode вызывается и возвращает управление). Если я беру любое другое окно, например виндовый калькулятор, и провожу на его пэйнтбоксом, у меня картинка bit исчезает вообще( на ней обычно черные символы на белом фоне) и остается только пэйнт бокс цвета clBtnFace, тоесть стандартного эксплоерного цвета.
При этом прога не виснет и не выдает никаких исключений(проверял). Что это может быть? Я хочу менять канву на пэйнтбоксе раз в 100 мс(точность не важна). Неужели канва не держит такую частоту рендеринга? Помогите плиз, а то я уже закалебался тестить...где в работе с канвой нужно искать тонкое место?
ЗЫ: сори, что так длинно...это ультра короткий вариант *-)
torry.net) и все заработало на нужной (10 герц) частоте.
Как выяснилось из не подтвержденных источников, это один из просчетов в реализации отрисовки на канве стандартных компонентов(в моем случае PaintBox). Заюзал набор Graphics32(