![]() |
|
#1
|
||||||
|
||||||
![]() Итак:
Подскажите пожалуйста, если кто знает, как правильно использовать TThread для того, чтобы вынести функцию наложения фльтра в отдельный поток. Вот код фильтра Sepia: Код:
Depth = 20; Создал потомка от TThread: Код:
Код писал по памяти, по-этому, могут быть опечатки - не ругайте. Так вот, в результате таких действий: Код:
Мне кажется, что все дело в том, что я либо не присваиваю Image1.Picture.Bitmap'у правильное значение либо как-то не так присваиваю внутренней переменной типа TBitmap потока входящую TBitmap... Помогите пожалуйста разобраться. THE CRACKER IS OUT THERE |
#2
|
||||
|
||||
![]() Частично ришил твою проблему
sepia.zip Частично, потому, что не всегда прога нормально срабатывает с первого раза. Запусти ее, нажми на кнопку, и если в Image2 не отрисуется преобразованная картинка, нажми кнопку еще раз. Такое случается не всегда (я пока не понял, почему это происходит), и максимум со второго раза (по крайней мере у меня) прога срабатывает как надо. В общем, поэксперементируй... |
#3
|
||||
|
||||
![]() Спасибо.
Потестил: После загрузки битмапки надо делаь так: bm.PixelFormat := pf24bit; Чтобы фильтр корректно ложился, а то у меня картинка становится черно-белой =) А вообще, я-то на этом и остановился, о том иречь - что то фильтр применяется, то нет, и в чем проблема- не могу понять, спасибо за помощь, но, м.б. как-то можно все-таки избежать этого бага? =( THE CRACKER IS OUT THERE |
#4
|
|||
|
|||
![]() Цитата:
![]() Итак, по порядку. Дело в том что TImage и TBitmap изначально не ThreadSafe классы и борланд в хелпах говорит что в многопоточной среде возможны баги. Но не стоит отчаиваться, в Канвасе есть специально приготовленные для нас методы Canvas.Lock и Canvas.Unlock (кажется Lock создает семафор, я особо не вдавался в подробности). Так вот, вызывая Lock мы блокируем доступ к канвасу из других thread'ов, а в конце, когда сделали все что хотели, вызываем unlock. Конкретно по файлу, который выложил Decoding. Внутри TSepiaThread.Execute в самом начале пишем Form1.Image2.Canvas.Lock; а в конце execut'а Form1.Image2.Canvas.Unlock; Да, еще убираем Synchronize( UpdateBmp ); внутри BmpToSepia, вместо него пишем просто UpdateBmp, иначе получим "DeadLock". вот, все бы казалось работает, я запустил, отрисовывает, но на попытке 10й я снова увидел "белый" битмап. Баг опять повторялся, хотя теперь очень редко. Тогда я еще вызвал Bmp.Canvas.Lock; и Bmp.Canvas.unLock; внутри метода BmpToSepia. Вот теперь все работает точно. p.s. Больше бага не замечал, но кто знает, проверьте у себя. уфф, чтото я много написал %) |
Этот пользователь сказал Спасибо AlexZL за это полезное сообщение: | ||
SpectraL (07.03.2015)
|
#5
|
||||
|
||||
![]() Спасибо, AlexZL, вроде бы у меня тоже без ошибок работает.
Бли, и как я сам-то не догадался? =)Совсем недавно как раз читал книгу про семафоры, критические секции и т.д.там как раз методы Lock и Unlock для Canvas'а были разобраны =) Еще раз спасибо всем большое. Если вновь возникнут ошибки - отпишусь. THE CRACKER IS OUT THERE |