класс исключения 'External: SIGABRT'

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
slpo10
незнакомец
Сообщения: 1
Зарегистрирован: 03.12.2012 12:22:47

класс исключения 'External: SIGABRT'

Сообщение slpo10 »

Выполняю в потоке:

Код: Выделить всё

   
Png := TPortableNetworkGraphic.Create;
   png.Canvas.Create;
   png.Canvas.Lock; // не помогло!
   Png.SetSize(450,300);
   Png.PixelFormat:=pf8bit;
   Png.Transparent:=true;
   Png.TransparentColor:=clBlue;
   Png.Canvas.Brush.Color:=clBlue;
   Png.Canvas.FillRect(0,0,450,300);
   Png.Canvas.Brush.Color:=clYellow;
   Png.Canvas.Ellipse(10,10,246,246);
   png.canvas.Font.Size:=40;
   png.canvas.Brush.Color:=clBlue;
   png.canvas.Pen.Color:=clwhite;
   png.canvas.Font.Color:=clwhite;
   png.canvas.TextOut(40,40,'Проверка текста');
   //png.SaveToStream(OutputData);
   png.SaveToFile('111.png');
   png.Canvas.unLock; //
   png.Free;       


Получаю или вылет программы или "программа вызвала subj"
Проблема возникает при первой же попытке отрисовать на канве.

Не в потоке под Linux и в потоке под Вынь код отрабатывает нормально.
Куда копать? Трабл в canvas и threads - попробовал работать с TBitmap - тоже самое.

Попробовал fcl-image - отрисовывает в потоке без проблем, но вывод текста (canvas.texout) там без кириллицы

Добавлено спустя 2 часа 9 минут 33 секунды:
Попробую сделать sinchronize

Добавлено спустя 19 часов 55 минут 7 секунд:
Ну сам себе и отвечу.
1) Synchronize действительно решил проблему
2) Canvas.lock, как альтернатива synchronize для визуальных компонентов, почему то не дал результата
Остался таки вопрос из области теории: в задаче спрашивалось "Отрисовать png в памяти и вывести в файл".
Если бы я рисовал что-либо на канве формы, было бы понятно, зачем блокировки, но я то рисовал в памяти, какого же тогда потребовалась блокировка?
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

Из кода не ясно, где и как создается Thread.
Ответить