Thread View: pl.comp.lang.pascal
27 messages
27 total messages
Started by Terrmit
Tue, 01 Apr 2008 08:14
[Lazarus] TCurl zawiesza się. Pomocy! Proszę!
Author: Terrmit
Date: Tue, 01 Apr 2008 08:14
Date: Tue, 01 Apr 2008 08:14
63 lines
3007 bytes
3007 bytes
Witam,
Próbuję użyć komponentu TCurl z biblioteki lazcurl, wszystko niby
pięknie działa, ale TCurl zawiesza się dokładnie po 300-stu
wywołaniach TCurl.Perform. Pobieram 300 stron html i koniec.
Zrobiłem testową procedurkę, aby wybadać problem, ale nie mogę
dojść w czym rzecz, dlatego proszę Was o pomoc.
Procedura ma pobrać 500 razy stronę googli, ale zawiesza się
po 300. To wygląda tak, jakby jakaś zmienna lub jakiś stos
się przepełniał, może więc powinienem coś zrobić jeszcze
w tej pętli? Może ma ktoś jakiś pomysł?
<code>
procedure TForm1.gCurlReceive(Sender: TObject; data: PChar; len:
Cardinal; var bContinue: Boolean);
begin
TMemoryStream(TCurl(Sender).OutputStream).Write(data^, len);
end;
procedure TForm1.gCurlWait(Sender: TObject);
begin
Application.ProcessMessages;
end;
procedure TForm1.Button1Click(Sender: TObject);
var strona: String;
i: Integer;
gCurl: TCurl;
HtmlStream:TMemoryStream;
begin
gCurl := TCurl.Create(Self);
gCurl.ConnectTimeout := 15;
gCurl.Timeout := 60;
gCurl.Threaded := True;
gCurl.UserAgent := 'Mozilla/4.0 (compatible; MSIE 5.5; Windows 98)';
gCurl.CookieFile:='google.txt';
gCurl.CookieSession:=True;
gCurl.OnWait := @gCurlWait;
gCurl.OnReceive:= @gCurlReceive;
gCurl.MaxConnects:=1;
gCurl.URL := 'http://www.google.pl/';
for i:=1 to 500 do begin
HtmlStream:=TMemoryStream.Create; //utworz strumien dla strony
try
gCurl.OutputStream:=HtmlStream; //przydzielenie strumienia
if gCurl.Perform then begin //Success... ale
//po 300 razach program zapetla sie (wisi) na tym Perform
//HtmlStream.Position := 0;
//strona := StreamToString(HtmlStream);
StatusBar1.Panels.Items[0].Text := 'OK '+IntToStr(i);
end else ShowMessage('Błąd pobierania strony!');
gCurl.ResultCode; //po bledzie ma przywracac stan CURLE_OK
finally
HtmlStream.Free;
end;
end;
gCurl.Free;
end;
</code>
Sławek
P.S. Lazarus 0.9.25 svn 14688, curlpas-2005-11-05,
curl-7.17.1-2.fc8.i386, System Fedora 8
Re: [Lazarus] TCurl zawiesza się. Pomocy! Proszę!
Author: Terrmit
Date: Tue, 01 Apr 2008 08:28
Date: Tue, 01 Apr 2008 08:28
31 lines
2111 bytes
2111 bytes
Może jeszcze dodam, że funkcja
function tCurl.Perform:boolean;
znajduje się w module curlobj.
Wywołuje ona funkcję
function tCurl.DoPerform(aCurl:pCurl):CurlCode;
(źródło w pliku ocurlthd.inc)
w której jest pętla while:
while (fBusy) do begin //Zapetla sie po 300 wywolaniach
usleep(fWaitInterval * 1000); //w tym czasie fBusy powinno
//byc juz false, a nie jest
if Assigned(fOnWait) and ( {$IFNDEF FPC}@{$ENDIF}fOnWait <> nil
) then begin
pthread_mutex_lock(fMutex);
fOnWait(self);
pthread_mutex_unlock(fMutex);
end else if Assigned(fWaitCallback) and ( {$IFNDEF
FPC}@{$ENDIF}fWaitCallback <> nil ) then begin
pthread_mutex_lock(fMutex);
fWaitCallback(fWaitData);
pthread_mutex_unlock(fMutex);
end;
end;
Doszedłem już do tego, że zmienna fBusy po 300 wywołaniach
ma cały czas wartość True i nie chce się zmienić na False,
stąd robi się nieskończona pętla.
Pytanie tylko dlaczego? Tu niestety utknąłem w analizie
problemu :(
Sławek
Re: [Lazarus] TCurl zawiesza się. Pomocy! Proszę!
Author: Terrmit
Date: Tue, 01 Apr 2008 10:25
Date: Tue, 01 Apr 2008 10:25
38 lines
2412 bytes
2412 bytes
Może jeszcze dodam, że funkcja
function tCurl.Perform:boolean;
znajduje się w module curlobj.
Wywołuje ona funkcję
function tCurl.DoPerform(aCurl:pCurl):CurlCode;
(źródło w pliku ocurlthd.inc)
w której jest pętla while:
fBusy:=True;
{$IFDEF WIN32}
//dla windows - wycialem
{$ELSE WIN32}
pthread_mutex_init({$IFDEF FPC}@{$ENDIF}fMutex, nil);
pthread_create({$IFDEF FPC}@{$ENDIF}fThread, nil, {$IFDEF
FPC}@{$ENDIF}CurlThreadExecute, self);
while (fBusy) do begin //Zapetla sie po 300 wywolaniach
usleep(fWaitInterval * 1000); //w tym czasie fBusy powinno
//byc juz false, a nie jest
if Assigned(fOnWait) and ( {$IFNDEF FPC}@{$ENDIF}fOnWait <> nil
) then begin
pthread_mutex_lock(fMutex);
fOnWait(self);
pthread_mutex_unlock(fMutex);
end else if Assigned(fWaitCallback) and ( {$IFNDEF
FPC}@{$ENDIF}fWaitCallback <> nil ) then begin
pthread_mutex_lock(fMutex);
fWaitCallback(fWaitData);
pthread_mutex_unlock(fMutex);
end;
end;
Doszedłem już do tego, że zmienna fBusy po 300 wywołaniach
ma cały czas wartość True i nie chce się zmienić na False,
stąd robi się nieskończona pętla.
Pytanie tylko dlaczego? Tu niestety utknąłem w analizie
problemu :(
Sławek
Re: [Lazarus] TCurl zawiesza się. Pomocy! Proszę!
Author: Terrmit
Date: Tue, 01 Apr 2008 13:36
Date: Tue, 01 Apr 2008 13:36
27 lines
1986 bytes
1986 bytes
Tutaj tworzony jest wątek CurlThreadExecute
> pthread_mutex_init({$IFDEF FPC}@{$ENDIF}fMutex, nil);
> pthread_create({$IFDEF FPC}@{$ENDIF}fThread, nil, {$IFDEF
> FPC}@{$ENDIF}CurlThreadExecute, self);
<code>
function CurlThreadExecute(o:pointer):LongInt; cdecl;
begin
with TCurl(o) do begin
fThdResult:=curl_easy_perform(fCurl);
fBusy:=False;
end;
Result:=0;
end;
</code>
Wygląda na to, że po 300-stu wywołaniach przestaje się ten wątek
wykonywać, dlatego zmienna fBusy pozostaje z wartością True.
Tylko dlaczego tak się dzieje?
Stała PTHREAD_THREADS_MAX = 1024.
Być może wątki nie są poprawnie zakończone i zachowują się jak zombi.
Aczkolwiek całość zakończona jest procedurą:
pthread_mutex_destroy({$IFDEF FPC}@{$ENDIF}fMutex);
Tylko jak sprawdzić, czy ilość utworzonych wątków doszła do 1024?
Jak sprawdzić ile ich jest?
Sławek
Re: [Lazarus] TCurl zawiesza się. Pomocy! Proszę!
Author: Łukasz 'Maly' Ostrowski
Date: Wed, 02 Apr 2008 15:01
Date: Wed, 02 Apr 2008 15:01
19 lines
1740 bytes
1740 bytes
Terrmit wrote:
> Wygląda na to, że po 300-stu wywołaniach przestaje się ten wątek
> wykonywać, dlatego zmienna fBusy pozostaje z wartością True.
> Tylko dlaczego tak się dzieje?
> Stała PTHREAD_THREADS_MAX = 1024.
> Być może wątki nie są poprawnie zakończone i zachowują się jak zombi.
> Aczkolwiek całość zakończona jest procedurą:
> pthread_mutex_destroy({$IFDEF FPC}@{$ENDIF}fMutex);
> Tylko jak sprawdzić, czy ilość utworzonych wątków doszła do 1024?
> Jak sprawdzić ile ich jest?
Pokaż lepiej kompilowalny proof-of-concept konsolowy, bez żadnych
za przeproszeniem TForm ;-).
--
Pozdrawiam,
Łukasz 'Maly' Ostrowski.
http://maly.nemo.pl/
Re: [Lazarus] TCurl zawiesza się. Pomocy! Proszę!
Author: Terrmit
Date: Wed, 02 Apr 2008 16:30
Date: Wed, 02 Apr 2008 16:30
23 lines
2097 bytes
2097 bytes
Łukasz 'Maly' Ostrowski pisze: > Terrmit wrote: [ciach] > > Pokaż lepiej kompilowalny proof-of-concept konsolowy, bez żadnych > za przeproszeniem TForm ;-). > Program jest okienkowy, to i kod okienkowy. Nie bardzo chce mi się kombinować żeby przerabiać to na konsolę, tym bardziej, że ostatni konsolowy program pisałem 10 lat temu. Ale przynajmniej dziękuję za zainteresowanie. Solaris 'objechał' mnie kiedyś, że libcurl to taka świetna biblioteka, a ja nie chcę z niej skorzystać. W końcu skorzystałem, to teraz okazuje się, że jest jakiś babol. Co prawda, nie korzystam bezpośrednio z libcurl (bo ni cholery nie wiem jak jej użyć w pascalu), ale za pośrednictwem curlpas, który wydawał się całkiem przyjazny, aż do chwili, gdy oparłem się o granicę tych 300 witryn. A może Pan Solaris dostrzeże to wołanie o pomoc i podpowie jak pobrać źródło strony do MemoryStream bezpośrednio za pomocą libcurl? Sławek
Re: [Lazarus] TCurl zawiesza się. Pomocy! Proszę!
Author: Terrmit
Date: Wed, 02 Apr 2008 21:28
Date: Wed, 02 Apr 2008 21:28
29 lines
1955 bytes
1955 bytes
Terrmit pisze:
> Tutaj tworzony jest wątek CurlThreadExecute
>> pthread_mutex_init({$IFDEF FPC}@{$ENDIF}fMutex, nil);
>> pthread_create({$IFDEF FPC}@{$ENDIF}fThread, nil, {$IFDEF
>> FPC}@{$ENDIF}CurlThreadExecute, self);
Kolejna wskazówka.
Po 300 wywołaniach (ale czasami po 301, a nawet po 302)
funkcja pthread_create zwraca kod 12 (ENOMEM), czyli
brak pamięci. Czyżby to oznaczało, że wątki nie są kończone
i zjadają pamięć?
Dopisałem pthread_exit(nil) na końcu wątku, ale to nic nie dało :(
> <code>
> function CurlThreadExecute(o:pointer):LongInt; cdecl;
> begin
> with TCurl(o) do begin
> fThdResult:=curl_easy_perform(fCurl);
> fBusy:=False;
> end;
> Result:=0;
pthread_exit(nil);
> end;
> </code>
>
Może jednaj ktoś wpadnie na pomysł, co tu szwankuje?
Sławek
Re: [Lazarus] TCurl zawiesza się. Pomocy! Proszę!
Author: Terrmit
Date: Wed, 02 Apr 2008 23:34
Date: Wed, 02 Apr 2008 23:34
38 lines
2706 bytes
2706 bytes
Terrmit pisze:
> Terrmit pisze:
>> Tutaj tworzony jest wątek CurlThreadExecute
>>> pthread_mutex_init({$IFDEF FPC}@{$ENDIF}fMutex, nil);
>>> pthread_create({$IFDEF FPC}@{$ENDIF}fThread, nil, {$IFDEF
>>> FPC}@{$ENDIF}CurlThreadExecute, self);
>
> Kolejna wskazówka.
> Po 300 wywołaniach (ale czasami po 301, a nawet po 302)
> funkcja pthread_create zwraca kod 12 (ENOMEM), czyli
> brak pamięci. Czyżby to oznaczało, że wątki nie są kończone
> i zjadają pamięć?
>
Znalazłem artykuł Mirosława Jedynaka o wątkach w Linuksie:
http://www.g2inf.one.pl/referaty/watki-referat.pdf
<cytat>
W momencie, gdy watek w stanie umożliwiającym dołączenie kończy
działanie jego zasoby (deskryptor wątku i stos) *nie są zwalniane*
dopóki inny watek nie wykona na nim pthread_join. Dlatego
pthread_join powinien być wykonany dla każdego nieodłączonego wątku.
</cytat>
I rzeczywiście. Wstawiłem tą funkcję na końcu procedury, gdzie
wątek nie powinien się już wykonywać. Pomogło!
Ale akapit wcześniej autor napisał, że:
<cytat>
Watek, do którego dołączamy musi być w stanie umożliwiającym dołączanie
(nie może być odłączony przez wywołanie pthread_detach [...]
</cytat>
Czyli chyba lepiej, gdy zaraz po utworzeniu wątku przez pthread_create,
zrobi się go wątkiem odłączonym. Wtedy po zakończeniu wątku jego
deskryptor i stos powinny być zwolnione.
pthread_detach(fThread);
Wydaje się, że to powinno pomóc. Chyba, że jest jeszcze inne lepsze
rozwiązanie tego problemu?
Sławek
Re: [Lazarus] TCurl zawiesza się. Pomocy! Proszę!
Author: Terrmit
Date: Wed, 02 Apr 2008 23:37
Date: Wed, 02 Apr 2008 23:37
38 lines
2712 bytes
2712 bytes
Terrmit pisze:
> Terrmit pisze:
>> Tutaj tworzony jest wątek CurlThreadExecute
>>> pthread_mutex_init({$IFDEF FPC}@{$ENDIF}fMutex, nil);
>>> pthread_create({$IFDEF FPC}@{$ENDIF}fThread, nil, {$IFDEF
>>> FPC}@{$ENDIF}CurlThreadExecute, self);
>
> Kolejna wskazówka.
> Po 300 wywołaniach (ale czasami po 301, a nawet po 302)
> funkcja pthread_create zwraca kod 12 (ENOMEM), czyli
> brak pamięci. Czyżby to oznaczało, że wątki nie są kończone
> i zjadają pamięć?
>
Znalazłem artykuł Mirosława Jedynaka o wątkach w Linuksie:
http://www.g2inf.one.pl/referaty/watki-referat.pdf
<cytat>
W momencie, gdy watek w stanie umożliwiającym dołączenie kończy
działanie jego zasoby (deskryptor wątku i stos) *nie są zwalniane*
dopóki inny watek nie wykona na nim pthread_join. Dlatego
pthread_join powinien być wykonany dla każdego nieodłączonego wątku.
</cytat>
I rzeczywiście. Wstawiłem tą funkcję na końcu procedury, gdzie
wątek nie powinien się już wykonywać. Pomogło!
Ale akapit wcześniej autor napisał, że:
<cytat>
Watek, do którego dołączamy musi być w stanie umożliwiającym dołączanie
(nie może być odłączony przez wywołanie pthread_detach [...]
</cytat>
Czyli chyba lepiej, gdy zaraz po utworzeniu wątku przez pthread_create,
zrobi się go wątkiem odłączonym. Wtedy po zakończeniu wątku jego
deskryptor i stos powinny być zwolnione.
pthread_detach(fThread);
Wydaje się, że to powinno pomóc. Chyba, że jest jeszcze inne lepsze
rozwiązanie tego problemu?
Sławek
Re: [Lazarus] TCurl zawiesza się. Pomocy! Proszę!
Author: Terrmit
Date: Thu, 03 Apr 2008 05:17
Date: Thu, 03 Apr 2008 05:17
37 lines
2717 bytes
2717 bytes
Terrmit pisze:
> Terrmit pisze:
>> Tutaj tworzony jest wątek CurlThreadExecute
>>> pthread_mutex_init({$IFDEF FPC}@{$ENDIF}fMutex, nil);
>>> pthread_create({$IFDEF FPC}@{$ENDIF}fThread, nil, {$IFDEF
>>> FPC}@{$ENDIF}CurlThreadExecute, self);
>
> Kolejna wskazówka.
> Po 300 wywołaniach (ale czasami po 301, a nawet po 302)
> funkcja pthread_create zwraca kod 12 (ENOMEM), czyli
> brak pamięci. Czyżby to oznaczało, że wątki nie są kończone
> i zjadają pamięć?
>
Znalazłem artykuł Mirosława Jedynaka o wątkach w Linuksie:
http://www.g2inf.one.pl/referaty/watki-referat.pdf
<cytat>
W momencie, gdy watek w stanie umożliwiającym dołączenie kończy
działanie jego zasoby (deskryptor wątku i stos) *nie są zwalniane*
dopóki inny watek nie wykona na nim pthread_join. Dlatego
pthread_join powinien być wykonany dla każdego nieodłączonego wątku.
</cytat>
I rzeczywiście. Wstawiłem tą funkcję na końcu procedury, gdzie
wątek nie powinien się już wykonywać. Pomogło!
Ale akapit wcześniej autor napisał, że:
<cytat>
Watek, do którego dołączamy musi być w stanie umożliwiającym dołączanie
(nie może być odłączony przez wywołanie pthread_detach [...]
</cytat>
To drugi sposób, chyba lepszy, gdy zaraz po utworzeniu wątku przez
pthread_create, zrobi się go wątkiem odłączonym. Wtedy po zakończeniu
wątku jego deskryptor i stos powinny być zwolnione.
pthread_detach(fThread);
Wydaje się, że to też działa. Chyba, że jest jeszcze inne lepsze
rozwiązanie tego problemu?
Sławek
Re: [Lazarus] TCurl zawiesza się. Pomocy! Proszę!
Author: Terrmit
Date: Thu, 03 Apr 2008 14:58
Date: Thu, 03 Apr 2008 14:58
4 lines
1264 bytes
1264 bytes
Dzięki stary! Wszystko na razie działa jak należy :) Sławek
Re: [Lazarus] TCurl zawiesza się. Pomocy! Proszę!
Author: Terrmit
Date: Thu, 03 Apr 2008 14:59
Date: Thu, 03 Apr 2008 14:59
6 lines
1321 bytes
1321 bytes
Terrmit pisze: > Dzięki stary! > Wszystko na razie działa jak należy :) > > Sławek Ależ proszę bardzo :)
Re: [Lazarus][OT] TCurl zawiesza się. Pomocy! Proszę!
Author: Łukasz 'Maly' Ostrowski
Date: Thu, 03 Apr 2008 15:05
Date: Thu, 03 Apr 2008 15:05
15 lines
1496 bytes
1496 bytes
Terrmit wrote: > Terrmit pisze: >> Dzięki stary! >> Wszystko na razie działa jak należy :) >> >> Sławek > Ależ proszę bardzo :) Muehehe ;-). Gratulacje Wam obu w rozwiązaniu tego problemu X-D. -- Pozdrawiam, Łukasz 'Maly' Ostrowski. http://maly.nemo.pl/
Re: [Lazarus][OT] TCurl zawiesza się. Pomocy! Proszę!
Author: Terrmit
Date: Fri, 04 Apr 2008 06:42
Date: Fri, 04 Apr 2008 06:42
11 lines
1601 bytes
1601 bytes
Łukasz 'Maly' Ostrowski pisze: [ciach] > Muehehe ;-). Gratulacje Wam obu w rozwiązaniu tego problemu X-D. > Skoro nikt się nie przyłączył do dyskusji, to musieliśmy sobie sami jakoś poradzić :) A tak na poważnie, to nie ma tu nikogo, kto by w pascalu używał curl do pobierania stron internetowych, albo do ftp? Sławek
Re: [Lazarus][OT] TCurl zawiesza się. Pomocy! Proszę!
Author: Łukasz 'Maly' Ostrowski
Date: Fri, 04 Apr 2008 15:13
Date: Fri, 04 Apr 2008 15:13
22 lines
1884 bytes
1884 bytes
Terrmit wrote: > Łukasz 'Maly' Ostrowski pisze: > [ciach] >> Muehehe ;-). Gratulacje Wam obu w rozwiązaniu tego problemu X-D. >> > Skoro nikt się nie przyłączył do dyskusji, to musieliśmy sobie > sami jakoś poradzić :) > > A tak na poważnie, to nie ma tu nikogo, kto by w pascalu > używał curl do pobierania stron internetowych, albo do ftp? Ja za curl nie przepadam bo ma API niczym orginalny curl dla NAZI C ;-). Swoje rzeczy zaciągałem swojego czasu jeszcze bardziej poronionym WinInet. -- Pozdrawiam, Łukasz 'Maly' Ostrowski. http://maly.nemo.pl/
Re: [Lazarus][OT] TCurl już naprawiony :)
Author: Terrmit
Date: Fri, 04 Apr 2008 20:13
Date: Fri, 04 Apr 2008 20:13
23 lines
2130 bytes
2130 bytes
Łukasz 'Maly' Ostrowski pisze: [ciach] > > Ja za curl nie przepadam bo ma API niczym orginalny > curl dla NAZI C ;-). Zgadza się, ale biblioteka curlpas daje całkiem fajny komponent TCurl, który pozwala korzystać z biblioteki curl całkiem przyjemnie. Tylko rozwój curlpas jakoś zatrzymał się w czasie, szczerze mówiąc nie wiem dlaczego. http://sourceforge.net/projects/curlpas Czyżby istniały we freepascalu inne lepsze rozwiązania, a ja o nich nic nie wiem? > > Swoje rzeczy zaciągałem swojego czasu jeszcze bardziej > poronionym WinInet. > Wcześniej używałem Indy, ale to kombajn i kabyła, i też były z nim problemy. Staram się używać jak najmniej zewnętrznych komponentów, bo nadmiernie rozpychają program. Lazarus i tak generuje dość duży plik wykonywalny. Sławek
Re: [Lazarus][OT] TCurl już naprawiony :)
Author: Łukasz 'Maly' Ostrowski
Date: Sun, 06 Apr 2008 09:59
Date: Sun, 06 Apr 2008 09:59
14 lines
1707 bytes
1707 bytes
Terrmit wrote: > Staram się używać jak najmniej zewnętrznych komponentów, > bo nadmiernie rozpychają program. Lazarus i tak generuje > dość duży plik wykonywalny. Duży? To chyba mało powiedziane, AFAIR ostatnio jak korzystałem z lazarusa to pusty projekt dawał mi 6mb exeka ~=]. -- Pozdrawiam, Łukasz 'Maly' Ostrowski. http://maly.nemo.pl/
Re: [Lazarus][OT] TCurl już naprawiony :)
Author: Solaris
Date: Sun, 06 Apr 2008 11:44
Date: Sun, 06 Apr 2008 11:44
20 lines
1981 bytes
1981 bytes
Dnia Sun, 6 Apr 2008 11:59:09 +0200, jakże pięknego Łukasz 'Maly' Ostrowski <maly@USUNnemo.pl> wystukał co zawarte poniżej: : Terrmit wrote: : > Staram się używać jak najmniej zewnętrznych komponentów, : > bo nadmiernie rozpychają program. Lazarus i tak generuje : > dość duży plik wykonywalny. : : : Duży? To chyba mało powiedziane, AFAIR ostatnio jak : korzystałem z lazarusa to pusty projekt dawał mi : 6mb exeka ~=]. A co to jest 6M przy dzisiejszych dyskach? ;) -- Home: admin.idns.pl (fajek.sytes.net) Linux registered user: 408584 Contact: GG#44450, solaris#idns.pl 19:16:28 -!- Platyna Erroneous Nickname
Re: [Lazarus][OT] TCurl niestety jeszcze nie naprawiony :(
Author: Terrmit
Date: Sun, 06 Apr 2008 15:49
Date: Sun, 06 Apr 2008 15:49
37 lines
2842 bytes
2842 bytes
Witam,
Nie no wymiękam już :(
Chyba zaczynam rozumieć dlaczego moduł curlpas został porzucony.
Wszystko pięknie działało, a teraz muszę wysłać formularz,
taki dość duży, a w tym plik graficzny. Metoda POST.
Użyłem więc funkcji TCurl.FormData.Add. Za pierwszym razem
poszło, nawet obrazek się uploadował (co za słowo :)).
Niestety za chwilę znów program zaczął mi się wywalać
na tej bibliotece, chociaż nic nie zmieniałem. Magia jakaś.
Wykrzacza się na tej funkcji, co chodzi w wątku:
function CurlThreadExecute(o:pointer):LongInt; cdecl;
begin
with TCurl(o) do begin
fThdResult:=curl_easy_perform(fCurl); //tu wskazuje błąd
fBusy:=False;
end;
Result:=0;
end;
Kombinuję z tym od kilku godzin. Nic nie pomaga i nie
mogę dojść w czym rzecz :(
Jak używam TCurl.PostFields do formularza, to idzie,
ale tym się chyba nie da grafiki przesłać. Elementy
formularza dodaję z separatorem '&':
MyCurl.PostFields := 'nazwa1=wartosc1&nazwa2=wartosc2&nazwa3=wartosc3';
Ktoś wie jak w ten sposób dołączyć grafikę?
Gdzieś wyczytałem, żeby dodać małpkę '@' przed nazwą pliku,
w ten sposób:
MyCurl.PostFields := 'nazwa1=wartosc1&nazwa2=wartosc2&nazwa3=wartosc3'+
'&'+'@'+'/home/slawek/katalog/plik.gif';
Ale w ten sposób też nie udało mi się załadować obrazka,
chociaż reszta formularza weszła na serwer i program się
nie wywalił.
Sławek :(
Re: [Lazarus][OT] TCurl niestety jeszcze nie naprawiony :(
Author: Łukasz 'Maly' Ostrowski
Date: Sun, 06 Apr 2008 18:15
Date: Sun, 06 Apr 2008 18:15
33 lines
2406 bytes
2406 bytes
Terrmit wrote: > Witam, > > Nie no wymiękam już :( > Chyba zaczynam rozumieć dlaczego moduł curlpas został porzucony. > Wszystko pięknie działało, a teraz muszę wysłać formularz, > taki dość duży, a w tym plik graficzny. Metoda POST. > Użyłem więc funkcji TCurl.FormData.Add. Za pierwszym razem > poszło, nawet obrazek się uploadował (co za słowo :)). > Niestety za chwilę znów program zaczął mi się wywalać > na tej bibliotece, chociaż nic nie zmieniałem. Magia jakaś. > Wykrzacza się na tej funkcji, co chodzi w wątku: > function CurlThreadExecute(o:pointer):LongInt; cdecl; > begin > with TCurl(o) do begin > fThdResult:=curl_easy_perform(fCurl); //tu wskazuje błąd > fBusy:=False; > end; > Result:=0; > end; Nie wyglada to dość skomplikowanie: http://curlpas.sourceforge.net/demo/testmpf2.pas.html I teraz metoda Kopiego i Pasta przerzuć to do siebie. ;-) -- Pozdrawiam, Łukasz 'Maly' Ostrowski. http://maly.nemo.pl/
Re: [Lazarus][OT] TCurl niestety jeszcze nie naprawiony :(
Author: Terrmit
Date: Sun, 06 Apr 2008 18:40
Date: Sun, 06 Apr 2008 18:40
21 lines
2126 bytes
2126 bytes
Łukasz 'Maly' Ostrowski pisze:
[ciach]
>
> Nie wyglada to dość skomplikowanie:
>
> http://curlpas.sourceforge.net/demo/testmpf2.pas.html
>
> I teraz metoda Kopiego i Pasta przerzuć to do siebie.
> ;-)
>
Ależ ja dokładnie taką metodę stosuję z tym, że mnie
interesuje tylko
MyCurl.FormData.Add( 'whodunit', 'testclient', '',
POST_TYPE_PLAIN ); // send a string as contents
do przesyłania danych formularzy (teksty z editów i memo)
oraz
MyCurl.FormData.Add( 'filethis', 'sendme.jpg', 'image/jpeg',
POST_TYPE_ATTACHMENT ); // send the file itself
pliki jpeg i gif z tym, że dla gifa daję 'image/gif'.
Niby proste, a curl się wywala :(
Re: [Lazarus][OT] TCurl niestety jeszcze nie naprawiony :(
Author: Łukasz 'Maly' Ostrowski
Date: Sun, 06 Apr 2008 18:44
Date: Sun, 06 Apr 2008 18:44
39 lines
2418 bytes
2418 bytes
Terrmit wrote: > Łukasz 'Maly' Ostrowski pisze: > [ciach] >> >> Nie wyglada to dość skomplikowanie: >> >> http://curlpas.sourceforge.net/demo/testmpf2.pas.html >> >> I teraz metoda Kopiego i Pasta przerzuć to do siebie. >> ;-) >> > Ależ ja dokładnie taką metodę stosuję z tym, że mnie > interesuje tylko > MyCurl.FormData.Add( 'whodunit', 'testclient', '', > POST_TYPE_PLAIN ); // send a string as contents > do przesyłania danych formularzy (teksty z editów i memo) > oraz > MyCurl.FormData.Add( 'filethis', 'sendme.jpg', 'image/jpeg', > POST_TYPE_ATTACHMENT ); // send the file itself > pliki jpeg i gif z tym, że dla gifa daję 'image/gif'. > > Niby proste, a curl się wywala :( Co to znaczy "wywala"? Exception, jakiś komunikat, cokolwiek? ;-) - Samochod mi nie działa - tzn? - No nie działa - huh? - Nie jeździ ;-). -- Pozdrawiam, Łukasz 'Maly' Ostrowski. http://maly.nemo.pl/
Re: [Lazarus][OT] TCurl niestety jeszcze nie naprawiony :(
Author: Terrmit
Date: Sun, 06 Apr 2008 18:52
Date: Sun, 06 Apr 2008 18:52
32 lines
2489 bytes
2489 bytes
Terrmit pisze: > Łukasz 'Maly' Ostrowski pisze: > [ciach] >> >> Nie wyglada to dość skomplikowanie: >> >> http://curlpas.sourceforge.net/demo/testmpf2.pas.html >> >> I teraz metoda Kopiego i Pasta przerzuć to do siebie. >> ;-) >> > Ależ ja dokładnie taką metodę stosuję z tym, że mnie > interesuje tylko > MyCurl.FormData.Add( 'whodunit', 'testclient', '', > POST_TYPE_PLAIN ); // send a string as contents > do przesyłania danych formularzy (teksty z editów i memo) > oraz > MyCurl.FormData.Add( 'filethis', 'sendme.jpg', 'image/jpeg', > POST_TYPE_ATTACHMENT ); // send the file itself > pliki jpeg i gif z tym, że dla gifa daję 'image/gif'. > > Niby proste, a curl się wywala :( Dostaję Project raised exception class 'External: SIGSEGV'. Execution paused Adress: $0017112B Procedure: strlen File: jak pominę wysyłanie pliku, to reszta idzie na serwer i błędu nie ma, czyli tylko przy przesyłaniu grafiki na serwer program się wywala.
Re: [Lazarus][OT] TCurl niestety jeszcze nie naprawiony :(
Author: Łukasz 'Maly' Ostrowski
Date: Sun, 06 Apr 2008 19:34
Date: Sun, 06 Apr 2008 19:34
20 lines
1975 bytes
1975 bytes
Terrmit wrote: > Dostaję > Project raised exception class 'External: SIGSEGV'. > Execution paused > Adress: $0017112B > Procedure: strlen > File: > > jak pominę wysyłanie pliku, to reszta idzie na serwer > i błędu nie ma, czyli tylko przy przesyłaniu grafiki > na serwer program się wywala. Skompiluj z debugging info i z line info i połap się gdzie ten segmentation fault leci. -- Pozdrawiam, Łukasz 'Maly' Ostrowski. http://maly.nemo.pl/
Re: [Lazarus][OT] TCurl niestety jeszcze nie naprawiony :(
Author: Terrmit
Date: Sun, 06 Apr 2008 21:29
Date: Sun, 06 Apr 2008 21:29
72 lines
3318 bytes
3318 bytes
Łukasz 'Maly' Ostrowski pisze:
> Terrmit wrote:
>> Dostaję
>> Project raised exception class 'External: SIGSEGV'.
>> Execution paused
>> Adress: $0017112B
>> Procedure: strlen
>> File:
>>
>> jak pominę wysyłanie pliku, to reszta idzie na serwer
>> i błędu nie ma, czyli tylko przy przesyłaniu grafiki
>> na serwer program się wywala.
>
>
> Skompiluj z debugging info i z line info i połap się
> gdzie ten segmentation fault leci.
>
Nie jestem pewien, czy właściwe opcje włączyłem, ale
przytoczę fragment z wyjścia debuggera:
[...]
~"[New Thread -1212765296 (LWP 11192)]\n"
~"[Switching to Thread -1212765296 (LWP 11192)]\n"
*stopped,reason="signal-received",signal-name="SIGSEGV",signal-meaning="Segmentation
fault",thread-id="8",frame={addr="0x0017112b",func="strlen",args=[],from="/lib/libc.so.6"}
(gdb)
<-stack-info-depth>
^done,depth="12"
(gdb)
<-stack-list-arguments 1 0 0>
^done,stack-args=[frame={level="0",args=[]}]
(gdb)
<-stack-list-frames 0 0>
^done,stack=[frame={level="0",addr="0x0017112b",func="strlen",from="/lib/libc.so.6"}]
(gdb)
<-stack-list-arguments 1 1 1>
^done,stack-args=[frame={level="1",args=[]}]
(gdb)
<-stack-list-frames 1 1>
^done,stack=[frame={level="1",addr="0xb7fbdf06",func="fread",from="/usr/lib/libcurl.so.4"}]
(gdb)
<-stack-list-arguments 1 2 2>
^done,stack-args=[frame={level="2",args=[]}]
(gdb)
<-stack-list-frames 2 2>
^done,stack=[frame={level="2",addr="0xb7fbf24c",func="curl_mvsnprintf",from="/usr/lib/libcurl.so.4"}]
[...]
Chyba wystarczy. To jest to miejsce, gdzie następuje błąd.
Szczerze mówiąc z obsługi debuggera jestem raczej słaby,
także te komunikaty niewiele mi mówią.
Może Tobie coś więcej podpowiedzą.
Sławek
Re: [Lazarus][OT] TCurl niestety jeszcze nie naprawiony :(
Author: Terrmit
Date: Sun, 06 Apr 2008 21:32
Date: Sun, 06 Apr 2008 21:32
19 lines
2110 bytes
2110 bytes
Łukasz 'Maly' Ostrowski pisze: > Terrmit wrote: >> Dostaję >> Project raised exception class 'External: SIGSEGV'. >> Execution paused >> Adress: $0017112B >> Procedure: strlen >> File: >> >> jak pominę wysyłanie pliku, to reszta idzie na serwer >> i błędu nie ma, czyli tylko przy przesyłaniu grafiki >> na serwer program się wywala. > > > Skompiluj z debugging info i z line info i połap się > gdzie ten segmentation fault leci. > Wydaje mi się ponadto, że błąd jest w innym miejscu, niż miejsce, w którym następuje 'katastrofa'.
Re: [Lazarus][OT] TCurl niestety jeszcze nie naprawiony :(
Author: Łukasz 'Maly' Ostrowski
Date: Sun, 06 Apr 2008 22:40
Date: Sun, 06 Apr 2008 22:40
16 lines
2001 bytes
2001 bytes
Terrmit wrote: > Wydaje mi się ponadto, że błąd jest w innym miejscu, > niż miejsce, w którym następuje 'katastrofa'. Ale to naprowadzić może na to prawdziwe miejsce ;). Jutro sie postaram do tego spojrzeć, teraz jestem wykończony, a na rano do roboty. Pozatym, nie przepadam za nazywaniem GDB debuggerem ;). Fatalnie się tym operuje... -- Pozdrawiam, Łukasz 'Maly' Ostrowski. http://maly.nemo.pl/
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads