Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.03.2015, 16:04
Аватар для SpectraL
SpectraL SpectraL вне форума
Начинающий
 
Регистрация: 19.05.2011
Адрес: Санкт-Петербург
Сообщения: 112
Версия Delphi: 10.1 Berlin
Репутация: 10
Вопрос Некорректная работа TBitmap после TThread.Suspended

Почему пиксел = $FFFFFFFF?
Код:
procedure TThread1.Execute;
begin
  Bitmap1 := TBitmap.Create;
  Bitmap1.SetSize(6, 6); // определяем размер изображения
  Thread1.Suspended := True; // в TForm1.Button1Click, присвоив False, запускаем поток
  ShowMessage(ColorToString(Bitmap1.Canvas.Pixels[0, 0])); // пиксел = $FFFFFFFF
end;

Последний раз редактировалось SpectraL, 06.03.2015 в 16:12.
Ответить с цитированием
  #2  
Старый 06.03.2015, 17:05
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Потому.
Потому, что битмап белый.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #3  
Старый 07.03.2015, 20:22
Аватар для SpectraL
SpectraL SpectraL вне форума
Начинающий
 
Регистрация: 19.05.2011
Адрес: Санкт-Петербург
Сообщения: 112
Версия Delphi: 10.1 Berlin
Репутация: 10
Восклицание

Потому что это баг, который происходит, если TCanvas использовать в TThread. Для исправления предлагается заблокировать TCanvas от других потоков (в данном примере, достаточно сделать TCanvas.LockCount <> 0).

TCanvas.LockCount
Если LockCount > 0, то холст заблокирован от других потоков. Поток, который не блокирует холст, перед его использованием, рискует получить ошибку (справка RAD Studio → TCustomCanvas.Lock).

TCanvas.Lock
Увеличивает LockCount на единицу.

TCanvas.Unlock
Уменьшает LockCount на единицу.

Код:
procedure TThread1.Execute;
begin
  Bitmap1 := TBitmap.Create;
  Bitmap1.Canvas.Lock;
  Bitmap1.SetSize(6, 6); // определяем размер изображения
  Thread1.Suspended := True; // в TForm1.Button1Click, присвоив False, запускаем поток
  ShowMessage(ColorToString(Bitmap1.Canvas.Pixels[0, 0])); // пиксел = clWhite
end;

http://hashcode.ru/questions/162625/...wer_sort=votes
http://www.delphisources.ru/forum/showthread.php?t=718
http://www.delphisources.ru/forum/sh...t=24037&page=2

Последний раз редактировалось SpectraL, 07.03.2015 в 20:31.
Ответить с цитированием
  #4  
Старый 09.03.2015, 20:17
Аватар для SpectraL
SpectraL SpectraL вне форума
Начинающий
 
Регистрация: 19.05.2011
Адрес: Санкт-Петербург
Сообщения: 112
Версия Delphi: 10.1 Berlin
Репутация: 10
Восклицание

Вероятно, вывод значения в окно ShowMessage, также, как и в форму, нужно выполнять в процедуре Synchronize.
Код:
procedure TThread1.Execute;
begin
  Bitmap1 := TBitmap.Create;
  Bitmap1.SetSize(6, 6); // определяем размер изображения
  Thread1.Suspended := True; // в TForm1.Button1Click, присвоив False, запускаем поток
  Synchronize(procedure begin ShowMessage(ColorToString(Bitmap1.Canvas.Pixels[0, 0])) end); // пиксел = clWhite
end;

Последний раз редактировалось SpectraL, 09.03.2015 в 20:23.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:57.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025