Skocz do zawartości

[Delphi] - TFileStream.Create, dostęp do pliku jako flaga?


Integer

Polecane posty

function  TSzabl.ConnectON: Boolean;
var FileName: String;
begin
 Result:= False;
 // ConnectOff;
 FileName:= fDirWsp+cFNConnect;
 try
   fFAConnect:= TFileStream.Create(FileName, fmCreate or fmShareDenyWrite or fmShareDenyRead);
   Result:= True;
   Exit;
 except fFAConnect:=nil; end;
end;

procedure TSzabl.ConnectOFF;
begin
 try if (fFaConnect<>nil) then   fFAConnect.Free; except end;
end;
ĄŚ)QM1ąą1ŃAą)(źź)ą(
Ń=8ŃĄ(Mą(1ąą1ŃAą(((MĄ5Ó()(

 

Plik fFAConnect zapisany np na dysku C: ma działać jak flaga dla kilku kopi programów,

jeśli jeden program jest ConnectON = True (czyli blokuje plik) to drugi czeka (po drodze robiąc coś innego) aż poprzedni zwolni plik.

Wszystko jest ok do momentu gdy pierwszy nie zwolni, bo jak zwolni to kolejny czekający w kolejce tyle razy robi Create ile ( tak podejrzewam ) sekund czekał w kolejce jak to poprawić?

 

Rozwiązanie ma działać również na dysku sieciowym czy isnieje inna możliwość tego typu? czy to będzie działać na dysku sieciowym?

Link do komentarza
Udostępnij na innych stronach

  • 1 month later...

Pieknie dedlockujesz aplikacje jak nie ma sieci albo nie da sie podlaczyc. Proponuje sprawdzic przed sleepem Application.termineted albo jakas flage typu userCancel.

 

@Integer: dobry nawyk zamiast uzywania free uzywaj FreeAndNil. Pozatym to rozwiazanie moze prowadzic do "zaglodzenia" komputera chcacego dobrac sie do pliku. Proponowalbym jakis bardziej finezyjny mechanizm jesli ma byc duza konkurencyjnosc dostepu.

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

Integer miał problem z rekurencją, nic nie wiemy jak ten fragment kodu jest wołany, więc nie ma sensu bardziej rozbudowywać przykładu.

 

Nie przekonasz mnie, że sprawdzanie w pętli Application.Terminated czy wołanie Application.ProcessMessages jest lepsze od wątków, bo na 90% będziesz miał 'przymulony' interfejs, opóźnione reakcje itp.

A jeśli chodzi o zakleszczone wątki to stosuję zasadę lepiej zapobiegać niż leczyć i nie mam problemów.

Link do komentarza
Udostępnij na innych stronach

nie mam zamiaru cie przekonywac co jest lepsze i nic nie pisalem o processMessages. Napisalem ze stworzyles potencjalny dead lock i czy to jest watek glowny czy stworzony pozniej nie ma to znaczenia. Brak warunku pozwalajacego na wyjscie "awaryjne" jest wg mnie bledem. Jesli uwazasz ze sprawdzenie 1 warunku na prymitywie w porownaniu do sleepa o dlugosci 1 s jest przymuleniem interfejsu to brak mi argumentow do polemiki.

 

" jeśli chodzi o zakleszczone wątki to stosuję zasadę lepiej zapobiegać niż leczyć i nie mam problemów."

nom, wlasnie lepiej zapobiegac, a ty pokazujesz jak je stwarzac. Bo abstrachujac od miejsca wywolania tego kodu, jaki jest spodziewany efekt dzialania aplikacji jesli user w przeciagu powiedzmy 1 min nie moze dostac sie do zasobu ?

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

Kiedyś pisałem program z dostępem do jednego pliku przez wielu użytkowników w pascalu.

Rozwiązałem to podobnie jak proponuje emes30, tylko wprowadziłem ograniczenie liczby prób, po przekroczeniu której program informował o braku dostępu do pliku i proponował przerwanie lub ponowienie próby.

Link do komentarza
Udostępnij na innych stronach

CYTAT(Toster @ pon, 11 sty 2010 - 12:45) <{POST_SNAPBACK}>

nie mam zamiaru cie przekonywac co jest lepsze i nic nie pisalem o processMessages. Napisalem ze stworzyles potencjalny dead lock i czy to jest watek glowny czy stworzony pozniej nie ma to znaczenia. Brak warunku pozwalajacego na wyjscie "awaryjne" jest wg mnie bledem.

 

Zgadzam się, ale powtarzam jeszcze raz:

Integer miał problem z rekurencją, nic nie wiemy jak ten fragment kodu jest wołany, więc nie ma sensu bardziej rozbudowywać przykładu.

Można i tak:

 while not (ConnectON or FImBored) do

co oczywiście dalej komplikuje przykład bo po wyjściu z pętli nie możemy oznajmić radośnie, że 'Dostęp już jest', bo nie znamy przyczyny wyjścia. W ten sposób dochodzimy do dylematu: podpowiedzieć czy dać gotowca ?

 

" jeśli chodzi o zakleszczone wątki to stosuję zasadę lepiej zapobiegać niż leczyć i nie mam problemów."

nom, wlasnie lepiej zapobiegac, a ty pokazujesz jak je stwarzac. Bo abstrachujac od miejsca wywolania tego kodu, jaki jest spodziewany efekt dzialania aplikacji jesli user w przeciagu powiedzmy 1 min nie moze dostac sie do zasobu ?

abstraHując wogóle od kodu, skąd wiesz, że taka sytuacja może wystąpić ?

 

...wiem, wiem, może nie może sprawdzić trzeba, ale (i tu powtarzam 3 raz) nie tego dotyczył problem Integera

 

A tak na marginesie to dziwię się, że nie oprotestowałeś użycia ShowMessage w wątku :)

Link do komentarza
Udostępnij na innych stronach

Fakt po wyjsciu z petli nie mozna oznajmic ze dostep jest, bo jak nie ma dostepu powinien pojsc exception.

uwazam ze lepiej dac trudniejszy przyklad do analizy niz uczyc zlych praktyk

poprawiajac czyjes orty sprawdz czy sam ich nie popelniasz w tym samym zdaniu w ktorym poprawiasz.

"skąd wiesz, że taka sytuacja może wystąpić ?" - jesli moze to kod przed nia zabezpieczasz albo tlumaczysz sie klientowi ktory przyjdzie do ciebie z AV ze ta sytuacja zdarza sie raz na 1000000 i akurat jemu sie zdarzyla (jak pokazuje doswiadczenie rzeczy malo prawdopodobne pojawiaja sie przy pierwszym uruchomieniu na kompie klienta)

 

"A tak na marginesie to dziwię się, że nie oprotestowałeś użycia ShowMessage w wątku" - true, nie spojrzalem na to, zapewne problem wyszedl by na jaw bardzo szybko ;)

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

Witam ponownie a wiec kolejno.

 

Dziękuje za zainteresowanie, ponieważ temat może mieć charakter rozwojowy.

 

@Toster

niedawno sobie stworzyłem w osobnym module, jak sadzisz nie jest to marnowanie procka?

 

 procedure tryFree(var Obj);
begin       
 try FreeAndNil(Obj); except end;
end;
ĘJ'ipZyćjg(\"z
zZa[[XXX[X[[YY[HYH[Y
HXyZ[HHZ[HźYH,XHYXÓ[Y[Y
L
NX][ÓYY[HZYZH[HyH[[HlHYZ[

ĘNYL
HZ[[[HY[YYQĘ        NŃ:ZH^[Y^]ZKNĘLĘ       NźyH^N][X][XK
N[H[N^][[[HYN[

 

a sam schemat postępowania chcę dopracować więc obecność MessageDlg jest opcjonalna,

dostęp ma być ogólnie do jakiegoś zasobu, pliku, grupy plików,

np. jeśli jeden użytkownik np nadpisuję dane pliki to drugi nie ma do nich dostępu,

prosiłoby się aby to było w wątku ale wywołania są max z 2-3 komputerów więc jednocześnie raczej się

nie spotkają.

Bo wtedy prosi się o coś bardziej skomplikowanego.

Link do komentarza
Udostępnij na innych stronach

Chociaż żeby potem nie zakładać nowego wątku można by pomyśleć nad tym żeby zrobić kolejkę oczekujących, tylko czy na samym pojedynczym góra dwóch plikach jest to możliwe?

Czy już kłaniają się serwery.

Zaznaczam że to jest rozważanie głównie dla dysku sieciowego (ale nie wyłącznie )

nie chciałbym też mnożyć bytów ponad potrzeby bo i takie klocki mi siec czasem trafiają.

 

A co do gotowców.. hm.. jak człowiek ma czas to rusza szare komórki, czasem jest "zaćma" jak po Sylwestrze :D,

czasem coś leży odłogiem i dojrzewa a w miedzy czasie robi się coś innego :).

Najfajniej jest jak jest na wczoraj, wtedy możliwości ludzkiego organizmu aż mnie zadziwiają... ale nie trzeba przeginać bo człowiek się starzeje:)

 

W tym przypadku jakiś efekt jest ale wydaje mi się trochę niesatysfakcjonujący stąd też rozważania czy można zrobić lepiej.

 

 

Zdrowia i wszystkiego Najlepszego w Nowym Roku (chociaż już nie tak bardzo).

Link do komentarza
Udostępnij na innych stronach

tryFree to profanacja, chowasz przed soba samym bledy. Jak ci tam idzie exception to znajdz przyczyne a nie ukrywaj ja.

kod czekajacy tez zamotales mocno, emes dal dobry przyklad, trzeba go tylko ciut rozszerzyc

 

time := 0;
while(not ConnectON) do  begin
   Sleep(1000);
   Inc(time);
   if (Application.terminated = true) or (time >= 50) then begin  
       Result := false;
       exit;
   end;
end;

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...