🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.delphi
Article #346189

Re: Problem z synchronizacją wątków i DB

#346189
From: wloochacz
Date: Mon, 27 Nov 2017 19:58
70 lines
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-mail
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>

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