Max1414 Napisano Sierpień 4, 2006 Zgłoś Share Napisano Sierpień 4, 2006 Zna ktoś jakiś sposób aby aplikacja się nie "unieruchomiała" podczas łączenia do servera FTP? Probowalem z wątkiem i nici, chyba by musiałbyć bez Synchronize, ale wtedy moglby wystapic "kolizje". Moje projekty: http://wojciechkulik.pl Link do komentarza Udostępnij na innych stronach More sharing options...
Toster Napisano Sierpień 4, 2006 Zgłoś Share Napisano Sierpień 4, 2006 zastanow sie zanim cos napiszesz. Albo zajrzyj najpierw do komponentow indy. Always Dark<br /> Link do komentarza Udostępnij na innych stronach More sharing options...
Max1414 Napisano Sierpień 4, 2006 Autor Zgłoś Share Napisano Sierpień 4, 2006 nikt nie jest idealny, a ty jak juz odpisujesz to moglbys konkretniej odpisc, przez co dwoch postow mniej by bylo :]. Patrzylem w komponentach indy i tak... antiFreeze nic nie daje, probowalem z tym indy do watku TIdThread (Podajrze), tez nic, szukałem po demkach indy jakiegos rozwiazania i tez nic nie ma...[/url] Moje projekty: http://wojciechkulik.pl Link do komentarza Udostępnij na innych stronach More sharing options...
Toster Napisano Sierpień 4, 2006 Zgłoś Share Napisano Sierpień 4, 2006 moze warto wiec zamiast 10 minut zastanowic sie nad problemem troche dluzej.Zrozumiec zasade i dowiedziec sie dlaczego sie blokuje a nie napisac 10 lini kodu i od razu pisac posta na forum.Mowiles ze probowales z threadem pochwal sie tym co napisales, a nie czekasz na gotowe rozwiazanie. Always Dark<br /> Link do komentarza Udostępnij na innych stronach More sharing options...
Max1414 Napisano Sierpień 4, 2006 Autor Zgłoś Share Napisano Sierpień 4, 2006 Nie czekam na gotowe rozwiazanie tylko na jakas podpowiedz...Ze zwyklym watkiem to zrobilem normalnie... [b]ort! stworzylem watek w Execute dalemSynchronize(Laczenie) a w procedurze Laczenie FTP.Connect;a z tym komponentem TIdThread(czy jakos tak) to o ile dobrze myslalem to zrobilem cos takiego:idThread.Synchronize(FTP.Connect); tez nic...a idAntiFreeze to tylko na forme wrzuciłem i dałem active na true, bo tam chyba nic wiecej nie potrzeba Moje projekty: http://wojciechkulik.pl Link do komentarza Udostępnij na innych stronach More sharing options...
KKKas Napisano Sierpień 4, 2006 Zgłoś Share Napisano Sierpień 4, 2006 Chyba w wątku nie musisz przez synchronize się łączyć (tylko musisz w reszcie aplikacji blokować najlepiej dostęp do komponentu Ftp, żeby nie było "jaj" ;). ҉ Link do komentarza Udostępnij na innych stronach More sharing options...
Max1414 Napisano Sierpień 5, 2006 Autor Zgłoś Share Napisano Sierpień 5, 2006 no wlasciwie tez tak mozna sprobuje, dzieki![size=18]EDIT:Hehe ehh... z watkami mam do czynienia od niedawna i to co znalazlem to juz czytalem o nich, ale kurcze nie wiem jak zrobić zeby gdy na głownej formie odpalimy watek z synchronize to zeby inna forma sie nie blokowala... bo chce wyswietlac postep na innej formie, postep wykonuje procedura(a nie watek), no a mimo to forma blokuje sie do czasu zakonczenia wątku...Probowalem juz dynamicznie tworzyc forme i pare innych rzeczy robić ale nic nie pomaga...A procka w watku musi być z Synchronize bo watek odpala sie kilka razy... Moje projekty: http://wojciechkulik.pl Link do komentarza Udostępnij na innych stronach More sharing options...
Toster Napisano Sierpień 5, 2006 Zgłoś Share Napisano Sierpień 5, 2006 jaki jest sens stosowania watku jesli za kazdym razem odpalasz jego metody przez synchronize ?Kurde az odpalilem delphi i [b]ort! do helpa co jest takiego strasznie zawilego w tych watkach ze motasz sie z tym i narzekarz ze nic sie nie da.Prosze TThread Help, jeden z podpunktow:Most methods that access an object and update a form must only be called from within the main thread or use a synchronization object such as TMultiReadExclusiveWriteSynchronizer.juz jest zaznaczone z czego korzystac jesli masz problemy z synchronizacja ->TMultiReadExclusiveWriteSynchronizerno to wejdzmy tam do helpa:Use TMultiReadExclusiveWriteSynchronizer to guard access to memory in a multi-threaded application. Unlike a critical section, which blocks all other threads from reading or writing its associated memory, TMultiReadExclusiveWriteSynchronizer allows multiple threads to read from the protected memory simultaneously, while ensuring that any thread writing to the memory has exclusive access.In applications where threads read from an object or variable frequently and only write to it occasionally, using the multi-read exclusive-write synchronizer instead of a critical section can result in considerable performance improvement.All access to the protected memory must be bracketed by calls to the BeginRead and EndRead or BeginWrite and EndWrite methods. Any thread that reads from or writes to this memory without using these calls can introduce thread conflicts.kolejna mozliwosc. jaka ? Critical sectionno to idzmy dalej do helpa:Use TCriticalSection to safeguard operations that may be disrupted if another thread executes certain sections of code before the operation is completed. Critical sections work like gates that allow only a single thread to enter at a time. Because they block the execution of other threads, overusing critical sections can seriously interfere with performance.Critical sections must be global in scope so that they are available to all threads. In every thread, any action that could interfere with the operations safeguarded by the critical section should only take place after calling the Acquire or Enter method. Threads that do not use the critical section for relevant operations can introduce bugs.po pobierznym przeczytaniu i chwili zastanowienia [b]ort! mi sie kilka sposobow rozwiazania twojego zadania:1. Robisz Threada ktory cos robi bez synchronize, "forma " (czyli glowny watek) robi co tam sobie chce, sprawdzajac co jakis czas czy Thread jest aktywny, jesli przechodzi do stanu suspend to wywoluje od niego jakas metode pobierania danych, po czym go niszczy.2. Odpalasz threada i wykorzystujac jedna z wspomnianych wyzej metod updatujesz jakies pole w formie informuja o przebiegu operacji. Gdy operacja zostanie zakonczona przekazujesz do formy dane3. Odpalasz threada ktory robi co ma robic, za kazdym razem gdy wykona czesc zadania przekazuje wyniki na forme, az dojdzie do konca.Teraz wez laskawie siadz, przeczytaj to tyle razy az zrozumiesz, napisz program posiedz nad nim 5 godzin az bedzie dzialal poprawnie i zrozumiesz o co wlasciwie w nim chodzi. Wklej rozwiazanie swojego problemu na forum moze sie komus przyda.PS.Nie odpalaj jednego watku kilka razy ! zrob kilka watkow tego samego typu kazdy niezalezny, chyba ze czynnosci ktore one wykonuja musza byc jedna po drugiej, ale w tedy bez sensu jest uzywac watkow. [b]ort! forma i tak bedzie nieaktywna (bo nie bedzie miala nic do roboty) dopoki watek laczacy sie nie nawiaze polaczenia wiec po co chcesz go uzywac ? Nie widzialem programu z progressbarem do laczenia sie. Zazwyczaj pisze connecting i aplikacja sobie "wisi" az sie zakonczy, a operacje read/write mozna rozbic na mniejsze bloki po wykonaniu ktorych odswiezany jest progrssbar...PS.2.Wez zerknij do demos tam jest przyjlad jak uzwac watkow, jak zalapiesz o co chodzi nie bedzie pozniej problemow.PS.3.Fuck czemu ja szukam za ciebie rzeczy ktore masz podstawione pod nos ? W sumie fakt latwiej zapytac na forum, zawsze znajdzie sie jakis frajer ktory to zrobi za mnie.... Always Dark<br /> Link do komentarza Udostępnij na innych stronach More sharing options...
Max1414 Napisano Sierpień 5, 2006 Autor Zgłoś Share Napisano Sierpień 5, 2006 czyli tak, nie chodzi mi o progressbar do laczenia, tylko o pobieranie plikow i mozliwosc w dowolnym momencie przerwania tego pobierania z FTP i wlasnie wszedlem zeby napisac ze ta zwiecha byla od komponentu FTP a nie od watku, a watek mam po to ze dana czynnosc pobierania plikow na dysk w przypadku "multiselect" czyli kilku plikow zaznaczonych, mogla byc odpalana jedna za druga no i tutaj przychodzi z pomoca Synchronize w watku dzieki ktorej nie wlacza sie wszystko na raz tylko robi sie kolejka. PS. nie narzekam ze sie nic nie da w watkach....EDIT:Poprzednim razem gdy pisalem o zwieche z powodu ftp KKKas doradzil zebym zrobil watek bez Synchronize i podzialalo, ale to bylo tylko dobre do connecta , bo w wypadku pobierania plikow juz tak nie moge zrobic, musi byc synchronize...EDIT2: Nie szukam frajerow ktorzy zrobia to za mnie ani nikogo innego, tylko [b]ort! szukam odpowiedzi, bo raczej ciezko wejsc w google wpisac swoj problem i znalezc na niego odpowiedz... Moje projekty: http://wojciechkulik.pl Link do komentarza Udostępnij na innych stronach More sharing options...
Toster Napisano Sierpień 5, 2006 Zgłoś Share Napisano Sierpień 5, 2006 niech cie dobrze zrozumiem:1.Wybierasz pliki do sciagniecia2.odpalasz dla kazdego pliku watek3. kazdy z watkow jest blokowany przez synchronize aby nie odpalily sie one naraz ?Jesli dobrze cie zrozumialem to bez obrazy ale najwieksza bzdura jaka slyszalem....Wyobraz sobie ze ktos zaznaczy 200 plikow i uruchomi ten algorytm......nie latwiej zrobic jeden watek obslugujacy dany server ftp ? i niech w watku siedzi sobie lista do ktorej bedziesz dorzucal pliki oraz polecenie co z tym zrobic. Jak watek bedzie wolny to sobie pobierze kolejne zadanie do wykonania i sie nim zajmie. Prosto szybko estetycznie i bez bugow. I na pewno o wile szybciej. Bo kazdy watek nie bedzie nawiazywal na poczatku polaczenia i zaczynal sciagania. Bedzie jeden watek ktory raz sie polaczy i wszystkim sie zajmieWyjasnij mi jeszcz dlaczego MUSI byc synchronize ? Najlepiej w punktach abym nie zabladzil gdzies po drodze... Always Dark<br /> Link do komentarza Udostępnij na innych stronach More sharing options...
Max1414 Napisano Sierpień 5, 2006 Autor Zgłoś Share Napisano Sierpień 5, 2006 hehehehhe nie no bez jaj nie zrobilem takiego syfu ze watek sie odpala i za kazdym razem laczy itp!![b]ort! mam tak:1. Procka od pobierania plikow, ktora odczytuje z StringListy zadania w postaci: [quote] plik1.jpgplik2.exeplik3.blafolder [/quote] - sa to nazwy plikow do pobrania na dysk, dzieki czemu mam taka TaskListe Dalej w petli po kolei wykonuje odpowiednie czynnosci i wywoluje watek z parametrami potrzebnymi do pobrania pliku.2. W watku w postaci procki synchronizowanejodpala sie FTP.Get(Parametr1Wyciagniety z parametru Create watku, parametr2..., false, FTP.ResumeSuporrted);jak sie pobierze ten plik to nastepny watek z kolejki ma dostep do tej procki i pobiera sie nastepny plik i tak do konca 3. Mysle ze teraz juz rozumiesz czemu w tej procce musze miec Synchronize... inaczej by wszystkie watki [b]ort! chcialy pobierac pliki.Edit:No i na innej formie chce wyswietlac tą TaskListe(z wyswietlaniem nie ma problemu) tyle ze jak bym chcial kliknac na przycisk przerywajacy te pobieranie to trzeba czekac az sie watek zakonczy... bo nie reaguj Moje projekty: http://wojciechkulik.pl Link do komentarza Udostępnij na innych stronach More sharing options...
Toster Napisano Sierpień 5, 2006 Zgłoś Share Napisano Sierpień 5, 2006 napisze to prosciej bo chyba nie rozumiesz:1. Odpalasz program2. W programie user wlacza opcje polacz sie z ftp. Twoj program tworzy nowy watek nazwijmy go TFTPThread i go uruchamia. TFTPThread dokonuje polaczenia i informuje o tym glowna aplikacje3. uzytkownik wybiera jakies pliki z servera i daje download. Twoj program przekazuje te plik (nazwy) do DZIALAJACEGO watka ktory z braku zajecia od czasu polaczenia sie z serverem nic nie robi. Gdy w swojej kolejce tenze watek zobaczy nowe zadania zaczyna je wykonywac.4. Aplikacja sprawdza sobie (jak jej potrzeba ) co robi watek i informuje o tym usera co jakis staly okres czasu.5. User klika discconect wiec program wywoluje w TFTPThread polecenie zamkniecia polaczenia po czym kiluje watek.Gdzie tu widzisz kilka watkow ? Gdzie tu widzisz problemy z synchronize ?Abys mogl przerwac sciaganie pliku nie mozesz tego robic na raz (za jednym zamachem sciagac caly plik) chyba ze komponent ktorego uzywasz jest przystosowany do pracy w watkach wtedy pewnie bedzie mial jakies pole Terminate/Abort albo odpowiednia procke ktora mozna wywolac asynchronicznie. Jesli nie to rob pobieranie pliku po kawalku. Inna metoda bardziej brutalna to gdy user klika Cancel Kilujesz na [b]ort! watek i po krzyku, chce czy nie skończy.Dalej nie odpowiedziales na moje pytanie pod tytulem dlaczego musi byc SYNCHRONIZE? [b]ort! nie przeczytales moich poprzednich postow ze zrozumieniem. W tym posicie napisalem to samo co we wczesniejszych, ujalem to tylko tak prosto jak tylko potrafilem. Jaki jest sens prowadzenia z toba dialogu skoro wychodza nam dwa monologi ? Ty swoje, ja swoje. Always Dark<br /> Link do komentarza Udostępnij na innych stronach More sharing options...
Max1414 Napisano Sierpień 5, 2006 Autor Zgłoś Share Napisano Sierpień 5, 2006 omg fakt zle pisalem caly czas nie chodzilo mi o kilka watkow tylko o jeden kilka razy tworzony no nie wiem jak to sie fachowo okresla...ort! jak mam watek to jak juz opisalem wczesniej jak to wszystko dziala to mam ta petle o ktorej pisalem co wywoluje watek odpowiedzialny za pobieranie i to wyglada ogolnie biorac tak: [code=Delphi] for i:=0 to TaskList.Count-1 do FTPWatek.Create(KomponeY^QZKY^Q[JNBz\",(ś\"Fk<z{zKrJ3y*ZśśŚ's\"ł)'7Z&ŹękĄśĄjKhŹ2Vjui' (FKomponentFTP as TidFTP).Get(FSciezkaDoPliku, FSciezkaDoc[K[K [Y K[YTY N [/code]kilka razy w tym samym momencie, jak ci nie o to chodzi to ja juz sie pogubilem EDIT: W poprzednim swoim poscie staralem ci sie to wytlumaczyc... po co to synchronize[size=18]EDIT:O LOL: Tak juz mnie tym watkiem zagadales ze zapomnialem ze tu chodzi teraz o FTP a nie o watek [quote] czyli tak, nie chodzi mi o progressbar do laczenia, tylko o pobieranie plikow i mozliwosc w dowolnym momencie przerwania tego pobierania z FTP i wlasnie wszedlem zeby napisac ze ta zwiecha byla od komponentu FTP a nie od watku, a watek mam po to ze dana czynnosc pobierania plikow na dysk w przypadku \"multiselect\" czyli kilku plikow zaznaczonych, mogla byc odpalana jedna za druga no i tutaj przychodzi z pomoca Synchronize w watku dzieki ktorej nie wlacza sie wszystko na raz tylko robi sie kolejka. [/quote]FINISHNo wreszcie mi to wszystko smiga... Byl dziwny blad ze przy pokazywaniu formy nie byl widoczny ListBox i to nie ze wzgledu na przestawione Visible czy cos poprostu jakby sie nie ladowal, a przy wlaczaniu progsa wywalalo ze nieprawidlowe dojscie do okna, ale jakos teraz sie samo naprawilo A z tym zawieszaniem sie to dalem do OnWork w ftp Application.ProcessMessages i smiga a przerywanie zrobilem ze na chama Terminate watku Temat zamknięty Moje projekty: http://wojciechkulik.pl 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.