Article View: pl.comp.lang.delphi
Article #346189Re: Problem z synchronizacją wątków i DB
From: wloochacz
Date: Mon, 27 Nov 2017 19:58
Date: Mon, 27 Nov 2017 19:58
70 lines
4619 bytes
4619 bytes
W dniu 2017-11-26 o 13:08, ExM pisze: > W dniu piątek, 24 listopada 2017 13:00:25 UTC+1 użytkownik mmm napisał: >> Takie rozwiązania "na szybko" prędzej czy później mszczą się dodatkowymi >> godzinami na szukanie AV ! >> >> Spróbuj zrobić to tak jak zaproponował Pan Roman w pierwszej odpowiedzi. > > Tak oczywiście zdaję sobie sprawę że będę musiał to przerobić. > Teraz musiałem rozwiązać problem a docelowo chcę przygotować rozwiązanie jak to robić zgodnie ze sztuką. > > Przede wszystkim szukam informacji jak to powinno być zaprojektowane. To proste - dokładnie odwrotnie jak to zrobiłeś. > Jeśli macie jakieś materiały jak powinienem tworzyć tego typu obiekty w trybie wielowątkowym i łączyć je z kontrolkami wizualnymi podeślijcie proszę info. To też proste - nie da się bez synchronizacji wątku z wątkiem głównym. Wszystko. A i jeszcze jedno - jeśli baza danych, to każdy wątek operujący na bazie danych musi (są wyjątki (a to zależy od bazy danych i jej biblioteki do połączenia, tzw. klienta) od reguły, ale najlepiej będzie jak uznamy, że MUSI) korzystać z osobnego połączenia (dla klikaczy; komponent Connection czy Database czy czego tam używasz). Jeśli tego nie zrobisz, to prosisz się o kłopoty. Jeśli chcesz to zrobić i nie wiesz ile może być tzw. _worker-threads_, to najlepiej jak skorzystasz z _connection pooling_ Jeśli wiesz co i jak, to zrób tak, aby każdy wątek roboczy korzystał z prywatnego połączenia z bazą. Co do tego Twojego blokowania zdarzeń - to nie będzie dobrze działać. Tak się nie da. Jeśli chcesz otwierać w wątku dataseta, który jest własnością formy głównej, a ta z definicji jest obsługiwana przez wątek główny, to... Musisz zapewnić, że nikt tego dataseta nie będzie używał z innego wątku (również z wątku głównego) bez synchronizacji w trakcie jego otwierania. Jawnie, pośrednio czy niejawnie. Aby to zrobić - to musisz odłączyć wszystkie DataSource od tego DataSet; np. DataSource.Dataset := nil; Innymi słowy - taki wątek powinien przejąć totalną kontrolę nad tym DataSetem na czas otwierania i oddać go po otwarciu, synchronizując z wątkiem głównym i przywracając stan przypisania DataSource, zdarzeń, etc. Tylko jak zachowa się Twój kod i kontrolki, kiedy im nagle z DataSource DataSet zniknie? ;-) Ten temat nie jest w Delphi do zrobienia prosto, jak się ma wyklikane wszystko w IDE. Jak widać, mam nadzieję, problem jest szerszy i wymaga podejścia, że tak powiem architektonicznego. Jeśli szukasz magicznej metody czy komponentu na realizację w/w zagadnienia, to odpuść sobie ten temat, ponieważ prędzej czy później skończy się to dziwnymi problemami. I na koniec - dlaczego chcesz otwierać dane w wątki pobocznym? osobiście przydałoby mi się to z raz czy dwa, ale generalnie nie. Zamiast odświeżania całości w wątku pobocznym, odświeżam wątku głównym tylko te rekordy, które zostały zmienione/dodane czy usunięte, pod warunkiem, że wcześniej zostały załadowane do DataSeta (bo i nie ładuję z serwera wszystkiego jak leci). Nie dość że działa to bardzo wydajnie (odświeżanie danych, niezależnie od ich ilości, to zazwyczaj ułamek sekundy), to nie wymaga fiku-miku z wątkami. -- wloochacz
Technical Details
Message-ID:
<5a1c6e4e$0$15198$65785112@news.neostrada.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!wsisiz.edu.pl!goblin2!goblin1!goblin.stu.neva.ru!newsfeed.neostrada.pl!unt-exc-02.news.neostrada.pl!unt-spo-a-01.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mailReferences:
<90a4ea00-38f5-45fc-b22c-7db238f908e2@googlegroups.com> <5a167ca4$0$5158$65785112@news.neostrada.pl> <94113bbf-b9d6-44cd-b316-47e127467ecb@googlegroups.com> <ov91kp$euo$1@portraits.wsisiz.edu.pl> <af71ebb6-3a5a-406b-a04b-9328b779a1d3@googlegroups.com>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!wsisiz.edu.pl!goblin2!goblin1!goblin.stu.neva.ru!newsfeed.neostrada.pl!unt-exc-02.news.neostrada.pl!unt-spo-a-01.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail Subject: Re: Problem z synchronizacją wątków i DB Newsgroups: pl.comp.lang.delphi References: <90a4ea00-38f5-45fc-b22c-7db238f908e2@googlegroups.com> <5a167ca4$0$5158$65785112@news.neostrada.pl> <94113bbf-b9d6-44cd-b316-47e127467ecb@googlegroups.com> <ov91kp$euo$1@portraits.wsisiz.edu.pl> <af71ebb6-3a5a-406b-a04b-9328b779a1d3@googlegroups.com> From: wloochacz <wloochacz@no.spam.gmail.com> Date: Mon, 27 Nov 2017 20:58:06 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.4.0 MIME-Version: 1.0 In-Reply-To: <af71ebb6-3a5a-406b-a04b-9328b779a1d3@googlegroups.com> Lines: 70 Message-ID: <5a1c6e4e$0$15198$65785112@news.neostrada.pl> Organization: Telekomunikacja Polska NNTP-Posting-Host: 83.21.128.138 X-Trace: 1511812686 unt-rea-a-02.news.neostrada.pl 15198 83.21.128.138:5985 X-Complaints-To: abuse@news.neostrada.pl Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit