Skocz do zawartości

[delphi] Problem z wstrzymywaniem aplikacji...


Max1414

Polecane posty

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

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 />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

Nie czekam na gotowe rozwiazanie tylko na jakas podpowiedz...
Ze zwyklym watkiem to zrobilem normalnie... [b]ort! stworzylem watek w Execute dalem
Synchronize(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

no wlasciwie tez tak mozna biggrin.gif sprobuje, dzieki!

[size=18]EDIT:
Hehe biggrin.gif 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

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 ->TMultiReadExclusiveWriteSynchronizer

no 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 section
no 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 dane
3. 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 />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

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

niech cie dobrze zrozumiem:
1.Wybierasz pliki do sciagniecia
2.odpalasz dla kazdego pliku watek
3. 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 zajmie

Wyjasnij mi jeszcz dlaczego MUSI byc synchronize ? Najlepiej w punktach abym nie zabladzil gdzies po drodze...

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

Link do komentarza
Udostępnij na innych stronach

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.jpg
plik2.exe
plik3.bla
folder [/quote] - sa to nazwy plikow do pobrania na dysk, dzieki czemu mam taka TaskListe smile.gif
Dalej w petli po kolei wykonuje odpowiednie czynnosci i wywoluje watek z parametrami potrzebnymi do pobrania pliku.
2. W watku w postaci procki synchronizowanej
odpala 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 smile.gif
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

napisze to prosciej bo chyba nie rozumiesz:
1. Odpalasz program
2. 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 aplikacje
3. 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 />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

omg fakt tongue.gif 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 biggrin.gif

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 smile.gif

[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]

FINISH
No 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 smile.gif A z tym zawieszaniem sie to dalem do OnWork w ftp Application.ProcessMessages i smiga smile.gif a przerywanie zrobilem ze na chama Terminate watku smile.gif
Temat zamknięty smile.gif

Moje projekty: http://wojciechkulik.pl

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

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

×
×
  • Utwórz nowe...