Article View: pl.comp.lang.delphi
Article #334574Re: Wolno działające wątki ...
From: Arivald
Date: Tue, 03 Jan 2012 15:39
Date: Tue, 03 Jan 2012 15:39
57 lines
3807 bytes
3807 bytes
W dniu 2012-01-03 15:27, DK pisze: > Witam. > > Ostatnio trochę się bawiłem przetwarzaniem bitmap i coś mnie mocno > zdziwiło. Ale po kolei > > Napisałem prostą funkcję przepuszczająca bitmapę przez filtr > dolnoprzepustowy i wszystko działało ładnie. Bitmapy się generowały i > było pięknie. > Jednak samo przetwarzanie nie było jakoś specjalnie szybkie. Przeniosłem > kod do wątku a w zasadzie tworzy się kilka wątków. W zależności od > potrzeb jest to definiowane. Jednak coś jest nie tak. > Gdy odpalony jest jeden wątek to przetwarzanie działa z grubsza tak jak > przed przeróbką. Jednak gdy wątków jest więcej to całość działa > kilkukrotnie wolniej. Zastanawiam się co jest tego przyczyną ? > Wykombinowałem, że może chodzi o konflikt zasobów. Wszystkie wątki > odwoływały się do tych samych obiektów TBitmap i macierzy (tablic) z > definicją filtra. Więc rozdzieliłem je. Każdy z nich pracuje na swojej > kopii fragmentu bitmapy i swojej lokalnej wersji macierzy. Na końcu > całość jest składana do kupy. Jednak dalej działanie aplikacji > wielowątkowej jest wolniejsze niż pojedynczego wątku przetwarzającego > bitmapę. Prawdopodobnie błąd jest w moim toku myślenia, a może chodzi o > jakieś zarządzanie wątkami ? > > I jeszcze jedno. Pojedynczy wątek obciąża mi procesor w 50% *(mam 2 > rdzeniowca) za to gdy są 2 wątki to obciążenie spada do ok 25%. Gdzie > mogę robić błąd ? Będę wdzięczy za wszelkie pomysły. A może polecicie > jakiegoś tutoriala opisującego poprawne działanie aplikacji wielowątkowych. > > Z góry dzięki za info. Widać wątki się nawzajem blokują na sekcjach krytycznych czy semaforach, czy co tam używasz do synchronizacji. Mam nadzieję że nie jest to Thread.Synchronize()? Bitmap.Canvas.Lock blokuje dostęp do canvasa bitmapy sekcją krytyczną. Tylko jeden wątek na raz da radę jej użyć. A bez Locka operacje na bitmapach w wątku są niebezpieczne (AV i inne cuda). Najlepszy model to taki w którym wątek dostaje całe zadanie dla siebie i nie musi nic współdzielić. To znaczy że na pewno musi mieć prywatną bitmapę wyjściową. Potem łączysz takie bitmapy blitując je do jednej większej. Układ koordynatów na każdej małej bitmapie (nazwijmy ja kafelkiem) można zmienić tak że zapisujący wątek będize się posługiwał takimi samymi koordynatami jak przy zapisie do dużej mapy. Jednocześnie pozwoli Ci to na dość płynną zmianę rozmiaru kafelka bez modyfikacji kodu. Dane wejściowe, jeśli są stałe mogą być współdzielone. Ale dane które są zmieniane muszą być albo prywatne dla wątku (najlepiej) albo synchronizowane (sekcją krytyczną). Ewentualnie TMultiReadExclusiveWriteSynchronizer, pozwoli na jednoczesne czytanie wielu wątkom, przy atomowym zapisie. -- Arivald
Technical Details
Message-ID:
<jdv7g8$9us$1@news.dialog.net.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!news.dialog.net.pl!not-for-mailReferences:
<jdv38v$4kr$1@inews.gazeta.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!news.dialog.net.pl!not-for-mail From: Arivald <arivald_@AT_interia_DOT_.pl> Newsgroups: pl.comp.lang.delphi Subject: Re: Wolno działające wątki ... Date: Tue, 03 Jan 2012 16:39:54 +0100 Organization: Dialog Net Lines: 57 Message-ID: <jdv7g8$9us$1@news.dialog.net.pl> References: <jdv38v$4kr$1@inews.gazeta.pl> NNTP-Posting-Host: poczta.pgs-soft.com Mime-Version: 1.0 X-Trace: news.dialog.net.pl 1325605192 10204 62.87.249.67 (3 Jan 2012 15:39:52 GMT) X-Complaints-To: abuse@dialog.net.pl NNTP-Posting-Date: Tue, 3 Jan 2012 15:39:52 +0000 (UTC) User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:9.0) Gecko/20111222 Thunderbird/9.0.1 In-Reply-To: <jdv38v$4kr$1@inews.gazeta.pl> X-Stationery: 0.7.7 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit