Integer Napisano Grudzień 8, 2009 Zgłoś Share Napisano Grudzień 8, 2009 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 More sharing options...
emes30 Napisano Styczeń 11, 2010 Zgłoś Share Napisano Styczeń 11, 2010 powinno być tak: procedure TSzabl.LoadAllListyPlikow; begin // Jesli nie mogę sie połaczyć czekam 1 sekundę i znów sie łaczę while(not ConnectON) do Sleep(1000); ShowMessage( 'Dostęp już jest'); end; Link do komentarza Udostępnij na innych stronach More sharing options...
Toster Napisano Styczeń 11, 2010 Zgłoś Share Napisano Styczeń 11, 2010 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 /> Link do komentarza Udostępnij na innych stronach More sharing options...
emes30 Napisano Styczeń 11, 2010 Zgłoś Share Napisano Styczeń 11, 2010 Niekoniecznie, może jest to wołane w wątku. Link do komentarza Udostępnij na innych stronach More sharing options...
Toster Napisano Styczeń 11, 2010 Zgłoś Share Napisano Styczeń 11, 2010 to jeszcze gorzej. spronboj wyjsc z aplikacji przy tak zakleszczonych watkach.... Always Dark<br /> Link do komentarza Udostępnij na innych stronach More sharing options...
emes30 Napisano Styczeń 11, 2010 Zgłoś Share Napisano Styczeń 11, 2010 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 More sharing options...
Toster Napisano Styczeń 11, 2010 Zgłoś Share Napisano Styczeń 11, 2010 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 /> Link do komentarza Udostępnij na innych stronach More sharing options...
jozekkg Napisano Styczeń 11, 2010 Zgłoś Share Napisano Styczeń 11, 2010 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 More sharing options...
emes30 Napisano Styczeń 11, 2010 Zgłoś Share Napisano Styczeń 11, 2010 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 More sharing options...
Toster Napisano Styczeń 11, 2010 Zgłoś Share Napisano Styczeń 11, 2010 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 /> Link do komentarza Udostępnij na innych stronach More sharing options...
Integer Napisano Styczeń 11, 2010 Autor Zgłoś Share Napisano Styczeń 11, 2010 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 More sharing options...
Integer Napisano Styczeń 11, 2010 Autor Zgłoś Share Napisano Styczeń 11, 2010 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 , 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 More sharing options...
Toster Napisano Styczeń 11, 2010 Zgłoś Share Napisano Styczeń 11, 2010 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 /> Link do komentarza Udostępnij na innych stronach More sharing options...
Integer Napisano Styczeń 11, 2010 Autor Zgłoś Share Napisano Styczeń 11, 2010 Faktycznie dużo prościej i czytelniej, ja w ogóle to chyba mam nawyk unikania pętli While, muszę ją częściej stosować. Dzięki Link do komentarza Udostępnij na innych stronach More sharing options...
Polecane posty
Zarchiwizowany
Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.