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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.03.2011, 22:33   #1
Dеlphi
нажмите + на весах
Пользователь
 
Регистрация: 10.11.2010
Сообщений: 30
По умолчанию обработка изображения в потоке

я делаю обработку изображения в отдельном потоке, после этого вывожу изображение на форму в Timage
в поток передаю ссылку на экземпляр Tbitmap:
Код:
   medf:= TfiltrMed.Create(true);
   medf.FreeOnTerminate:=true;
   medf.OnTerminate:=OnTerminatepot;
   medf.Priority :=tpNormal;
 medf.resul:=@bmpp; //передача ссылки потоку
   medf.Resume;
в OnTerminatepot вывожу изображение на форму :Image1.Picture.Assign(bmpp);
свойства в потоке:
Код:
public
    bmp: pTchizorb;
    resul: ^Tbitmap;
если а потоке использую синхронизацию и все по помещаю в
Код:
Synchronize(
    procedure
    begin
//
    end   );

то работает без ошибок, а без синхронизации изображение получается все черное или поток завершается раньше в ремени.. хотя общих данных одновременно в потоке не использую, в чем может быть косяк?
Если помог нажми на весы
Dеlphi вне форума Ответить с цитированием
Старый 04.03.2011, 01:37   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

работа с VCL в потоке должна быть совершена только через Synchronize
соответственно именно туда надо вынести рисование битмапа.

да кстати
^Tbitmap, не надо этого в данном случае, в Делфи объекты хранятся только по указателю, в итоге у вас выходит указатель на указатель.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.03.2011, 02:02   #3
Dеlphi
нажмите + на весах
Пользователь
 
Регистрация: 10.11.2010
Сообщений: 30
По умолчанию

битмап у меня отдельная переменная, не связана с image1, рисую я на форме без потока, но если я не передаю указалеть в поток а создаю в нем новый битмап и копирую в него битмап другой, то ошибки нет.
в место:
Код:
medf.resul:=@bmpp
так:
Код:
medf.resul:=Tbitmap.Create;
medf.resul.Width:= Image1.Picture.Bitmap.Width;
medf.resul.Height:=Image1.Picture.Bitmap.Height;
medf.resul.Canvas.Draw(0,0,Image1.Picture.Bitmap);
но я не хочу так делать потому что это работает дольше и памяти больше нужно..

я еще передаю ссылку на динамический массив, он тоже не явный указатель?, но без "^" не работает
Если помог нажми на весы

Последний раз редактировалось Dеlphi; 04.03.2011 в 02:07.
Dеlphi вне форума Ответить с цитированием
Старый 04.03.2011, 03:42   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

я имел в виду сделать так:
Код:
resul:TBitmap;
//
medf.resul:=bmpp;
Цитата:
в OnTerminatepot вывожу изображение на форму :Image1.Picture.Assign(bmpp);
событие OnTerminate выполняется в контексте потока и потому у вас ошибка без синхронизации.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.03.2011, 13:46   #5
Dеlphi
нажмите + на весах
Пользователь
 
Регистрация: 10.11.2010
Сообщений: 30
По умолчанию

а как синхронизировать только OnTerminate ?

я сделал обработку изображения в несколько потоков, один поток свою часть изображения обрабатывает, но без синхронизации на форму не что не выводится всё белое
Если помог нажми на весы

Последний раз редактировалось Dеlphi; 04.03.2011 в 13:48.
Dеlphi вне форума Ответить с цитированием
Старый 04.03.2011, 13:47   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

может стоит без OnTerminate сделать?
в конце execute написать вызов синхрониз-метода который и нарисует.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.03.2011, 14:07   #7
Dеlphi
нажмите + на весах
Пользователь
 
Регистрация: 10.11.2010
Сообщений: 30
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
может стоит без OnTerminate сделать?
в конце execute написать вызов синхрониз-метода который и нарисует.
пробывал так:
Код:
Synchronize(
 procedure begin
    form6.OnTerminatepot(self);
  end );
и событие OnTerminatepot не указывал, все равно не работает, работает только тогда когда синхронизована сама процедура обработки изображения
работает только так:
Код:
procedure TfiltrMed.Execute;
begin
y:=resul.Height;
x:=resul.Width ;

Synchronize(exe2);     //exe2-обрабатывает изображнение

end;
у меня delphi XE и delphi 2010
Если помог нажми на весы

Последний раз редактировалось Dеlphi; 04.03.2011 в 14:27.
Dеlphi вне форума Ответить с цитированием
Старый 04.03.2011, 18:30   #8
Dеlphi
нажмите + на весах
Пользователь
 
Регистрация: 10.11.2010
Сообщений: 30
По умолчанию

выяснил что без синхронизации битмам.Canvas.Pixels[10,10] и любые координаты пикселя равно -1, даже если перед этим пикселю присваивать какое ни будь знечение
с синхронизацией:

Код:
Synchronize(
exe2 // обработка изображения (для примера  сделал там цикл который все  пиксели ставит в красный цвет)
);


 Synchronize(
 procedure begin
 resul2.Canvas.Pixels[10,10]:=clRed;
 showmessage(inttostr(resul2.Canvas.Pixels[10,10]))  ;
 end);
выводит 255
без синхронизации:
Код:
exe2;

   Synchronize(
 procedure begin
 resul2.Canvas.Pixels[10,10]:=clRed;
 showmessage(inttostr(resul2.Canvas.Pixels[10,10]))  ;
    form6.OnTerminatepot(self);
     end );
выводит -1

может это из за delphi?
Если помог нажми на весы

Последний раз редактировалось Dеlphi; 04.03.2011 в 18:33.
Dеlphi вне форума Ответить с цитированием
Старый 04.03.2011, 22:01   #9
Dеlphi
нажмите + на весах
Пользователь
 
Регистрация: 10.11.2010
Сообщений: 30
По умолчанию

Проблему решил
Если помог нажми на весы
Dеlphi вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Попиксельная обработка изображения shushlev Мультимедиа в Delphi 17 15.05.2013 20:27
Отрисовка изображения в потоке STRELOK-2007 Общие вопросы Delphi 0 23.01.2011 22:47
Обработка изображения (инверсный фильтр) Dreablin C++ Builder 5 06.12.2009 22:28
Чтение изображения из базы данных, Вместо изображения - "System.Byte[]" ruelCrow Общие вопросы .NET 3 10.07.2008 23:29
Обработка изображения Hollander Мультимедиа в Delphi 6 10.03.2008 14:21