Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.02.2010, 21:20   #1
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию Можно ли использовать TBitMap в потоке?

Написал прогу, начал тестить - иногда вылетает ошибка Out of system resources. Начал искать описание ошибки - нашёл. Сказали, что TBitMap - элемент VCL и его нельзя использовать в потоке.
Как быть?
TwiX вне форума Ответить с цитированием
Старый 27.02.2010, 21:56   #2
Karabash
Форумчанин
 
Регистрация: 26.07.2009
Сообщений: 216
По умолчанию

Цитата:
Сообщение от TwiX Посмотреть сообщение
Сказали, что TBitMap - элемент VCL и его нельзя использовать в потоке.
Утверждение более чем странное, если не сказать - вредное.
Цитата:
Сообщение от TwiX Посмотреть сообщение
Как быть?
Копать в сторону Synchronize (метода класса TThread).
Karabash вне форума Ответить с цитированием
Старый 29.09.2010, 02:11   #3
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Synchronize - это не то, ведь я работаю не с компонентом формы. А если уж делать синхронизацию, то, как по мне, лучше использовать критические секции...

Возник опять такой же вопрос... Вспомнил, что уже задавал его - начал копать в поиске - нашёл. Но тут ничего не оказалось. Как я понял, что TBitmap нужно чем-то не vcl-ным заменить. А чем?

Последний раз редактировалось Stilet; 29.09.2010 в 08:10.
TwiX вне форума Ответить с цитированием
Старый 29.09.2010, 02:15   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

TBitmap не визуальный класс.
единственное аккуатнее с использованием одного обьекта во многих потоках.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.09.2010, 03:08   #5
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

один поток. Пытаюсь изменить pixelFormat - вылетает Out of system resources.
TwiX вне форума Ответить с цитированием
Старый 29.09.2010, 08:10   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код в студию.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.09.2010, 12:18   #7
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Код, например, такой:
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  TMyThread.Create(false);
end;

{ TMyThread }

procedure TMyThread.Execute;
var
  Canvas: TCanvas;
  bmp: TBitmap;
  ScreenDC: HDC;
  clr: Cardinal;
  i: integer;
begin

  ScreenDC := GetDC(HWND_DESKTOP);

  Canvas := TCanvas.Create;
  Canvas.handle := ScreenDC;
  bmp := TBitmap.Create;
  bmp.Width := 10;
  bmp.Height := 10;

  bmp.Canvas.CopyRect(Rect(0, 0, 10, 10), Canvas, Rect(0, 0, 10, 10));
  try
    bmp.PixelFormat := pf4bit;
    //bmp.SaveToFile('1.bmp');
  except
    on e: Exception do
          ShowMessage(e.Message);
      end;
   //bmp.SaveToFile('1.bmp');
end;
Причем, примерно 1 раз из 5 ошибки не появится. Пробовал использовать Lock у канваса - не помогает
TwiX вне форума Ответить с цитированием
Старый 29.09.2010, 12:50   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Canvas := TCanvas.Create;
А освобождать объект в конце действа как бы не модно?
Цитата:
bmp.Canvas.CopyRect(Rect(0, 0, 10, 10), Canvas, Rect(0, 0, 10, 10));
А я больше BitBlt люблю использовать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.09.2010, 17:45   #9
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Причем здесь освобождение? Писал чисто для примера. А копирект на моем ноуте работает не медленней чем битблт (первая работает через проц, а вторая через видеокарту по-моему) .
Так а ошибка то почему?
TwiX вне форума Ответить с цитированием
Старый 29.09.2010, 20:03   #10
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

А если не в потоке, ошибка появляется?
4 бит? Необычная глубина цвета какая-то, нужна именно такая?
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Tclientsocket и Tserversocket можно использовать в интернете? pro100-delphi Работа с сетью в Delphi 7 04.12.2009 19:11
Sorry, а можно использовать тэги? BaronTreep О форуме и сайтах клуба 27 18.07.2009 13:25
IF - можно ил и как использовать? iankov SQL, базы данных 6 13.06.2009 12:13
Можно ли использовать ole в .net? engineslava Общие вопросы .NET 0 09.09.2008 10:59
можно ли так использовать прокси в Webbrouser tigr1991 Работа с сетью в Delphi 1 10.02.2008 20:02