Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Threadovi i Delphiju

[es] :: Pascal / Delphi / Kylix :: Threadovi i Delphiju

[ Pregleda: 1462 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

reikonija
Faks<lll>
Visegrad

Član broj: 213271
Poruke: 121
*.teol.net.



+4 Profil

icon Threadovi i Delphiju07.11.2011. u 20:40 - pre 151 meseci
Napravio sam program koji parsuje 100 ili vise stranica sa google pretrage , tj. vadi .mp3 linkove iz source koda stranice.
Taj proces zna trajati i po 30 minuta , sto je uzimajuci u obzir strpljenje danasnjih ljudi, a posebno profesora predugo.
Rekli su mi da koristim threadove i ubrzam proces.E sad od vas samo trazim da mi ostavite linkove do knjiga , tutoriala , pdf'ova bilo cega sto mi moze pomoci da bolje razumijem Threadove , upravo sada citam Multithreading od Martin Harvey.
Zeleo bih da tu listu linkova podjelim izmedju threadova.Hvala
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Threadovi i Delphiju07.11.2011. u 22:11 - pre 151 meseci
> Napravio sam program koji parsuje 100 ili vise stranica sa google pretrage , tj. vadi .mp3 linkove iz source koda stranice.
> Taj proces zna trajati i po 30 minuta , sto je uzimajuci u obzir strpljenje danasnjih ljudi, a posebno profesora predugo.

Ako je u pitanju samo prosto parsovanje takav posao ne bi smeo da traje duže od nekoliko sekundi. Ako imaš i neke dodatne operacije (download, smeštanje u bazu i slicno), mogu uticati na usporenje ali je to teško reći bez nekih konkretnijih informacija. U svakom slučaju siguran sam da se proces (algoritam) može unaprediti i optimizovati i da bi prvo taj deo trebao pogledati pre pokušaja sa threadovima.

> Rekli su mi da koristim threadove i ubrzam proces.E sad od vas samo trazim da mi ostavite linkove do knjiga , tutoriala , pdf'ova bilo cega sto
> mi moze pomoci da bolje razumijem Threadove , upravo sada citam Multithreading od Martin Harvey.

Potraži starije poruke u ovoj grupi (ključna reč thread), bilo je dosta diskusija na tu temu i detaljnijih objašnjenja. Svakako pogledaj i primere koji dolaze uz sam Delphi.

> Zeleo bih da tu listu linkova podjelim izmedju threadova.Hvala

To ima smisla samo raditi za onoliko koliko procesor ima jezgara, ako je to 4 jezgra onda verovatno max 4 threada što opet znači 7, 8 minuta ukupno.
 
Odgovor na temu

reikonija
Faks<lll>
Visegrad

Član broj: 213271
Poruke: 121
*.teol.net.



+4 Profil

icon Re: Threadovi i Delphiju08.11.2011. u 13:25 - pre 151 meseci
Evo koda:

Pocni google search:

Code:

[Button1.click]
if scombobox1.ItemIndex=0 then
begin
GetSitesGoogleApi;
sgauge1.Progress:=0;
sbutton2.Enabled:=false;
sbutton3.SetFocus;
timer1.Enabled:=true;
scombobox3.Enabled:=false;
scombobox1.Enabled:=false;
scombobox5.Enabled:=false;
scombobox2.Enabled:=false;
sedit1.Enabled:=false;
end;


Code:

procedure TForm1.GetSitesGoogleApi;
var criter:string;
begin
    google:=TStringList.Create;
    criter:= ChangeString(sedit1.Text,'%20');  /// ne znam sto ali google Api izbacuje gresku ako ne stavim enkodiran url..
    With HttpCli1 do begin
    URL            := 'http://ajax.googleapis.com/aja...es/search/web?v=1.0&start=' + slabelfx4.Caption + '&rsz=large&q=' + criter;
    RequestVer     := '1.1';
    Agent          := trim(scombobox2.Text);
    RcvdStream := TMemoryStream.Create;
    try
        Get;
    except
        ShowMessage('There has been an error , check your internet connection !');
        RcvdStream.Free;
        Exit;
    end;
    RcvdStream.Seek(0,0);
    google.LoadFromStream(RcvdStream);
    slabelfx4.Caption:=inttostr(strtoint(slabelfx4.Caption) + 8);
    RcvdStream.Free;
  end;
end;




Code:

procedure TForm1.ParseGoogleApi;
var Pos: integer;
    sText: string;
begin
  sText := ExtractText(google.Text, '"url":"', '","visibleUrl"', 1, Pos);
  while sText <> '' do
  begin
    schecklistbox1.Items.Add(sText);
    sText := ExtractText(google.Text, '"url":"', '","visibleUrl"', Pos, Pos);
  end;
   slabelfx5.Caption:=inttostr(schecklistbox1.Items.Count);
end;


Code:

[Timer1]
if length(google.Text)>40 then
  begin
  ParseGoogleApi;
  slabelfx5.Caption:=inttostr(schecklistbox1.Items.Count);
  google.clear;
  slabelfx13.Caption:='Working';
  schecklistbox1.Items.Text := StringReplace(schecklistbox1.Items.Text,'%3F','?', [rfReplaceAll]);
  schecklistbox1.Items.Text := StringReplace(schecklistbox1.Items.Text,'%3D','=', [rfReplaceAll]);
  schecklistbox1.Items.Text := StringReplace(schecklistbox1.Items.Text,'%26','&', [rfReplaceAll]);
  schecklistbox1.Items.Text := StringReplace(schecklistbox1.Items.Text,'%3A',':', [rfReplaceAll]);
  schecklistbox1.Items.Text := StringReplace(schecklistbox1.Items.Text,'%3B',';', [rfReplaceAll]);
  schecklistbox1.Items.Text := StringReplace(schecklistbox1.Items.Text,'%40','@', [rfReplaceAll]);
  schecklistbox1.Items.Text := StringReplace(schecklistbox1.Items.Text,'%3B','+', [rfReplaceAll]);
  schecklistbox1.Items.Text := StringReplace(schecklistbox1.Items.Text,'%25','%', [rfReplaceAll]);
  schecklistbox1.Items.Text := StringReplace(schecklistbox1.Items.Text,'%5B','[', [rfReplaceAll]);
  schecklistbox1.Items.Text := StringReplace(schecklistbox1.Items.Text,'%5D',']', [rfReplaceAll]);
  sgauge1.AddProgress(100 div 8);
  GetSitesGoogleApi;
end
end;



To mi je kod koji skida stranice sa google search-a , isti je princip i za skidanje stranica iz liste i parsovanja...

 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Threadovi i Delphiju08.11.2011. u 18:26 - pre 151 meseci

> To mi je kod koji skida stranice sa google search-a , isti je princip i za skidanje stranica iz liste i parsovanja...

Ne vidi se odavde gde je usko grlo, kada debaguješ, koji deo koda najduže traje? Najbolje da pustiš program kroz profajler to će dati tačne rezultate ili ubaci sam neko logovanje na određenim mestima. Par stvari se primećuje na prvi pogled:

sText := ExtractText(google.Text, '"url":"', '","visibleUrl"', Pos, Pos);

Vrlo neefikasno za duže stringove i veći broj ponavljanja, stalno se realocira memorija, plus se ne vidi šta radi ta ExtractText i stalno poziva stringList.Text. Najbolje je da na početku dodeliš vrednost stringList.Text nekoj privremenoj promenljivoj i prosto ideš kroz taj string od početka do kraja i tražiš te ključne reči. Druga varijanta je da se isto vrtiš u ovoj while petlji i da pretragu radiš od mesta gde je prethodna završena (recimo sa PosEx funkcijom).

schecklistbox1.Items.Add(sText);

Ako ima mnogo stavki ovo će biti sporo.

checklistbox1.Items.Text := StringReplace(schecklistbox1.Items.Text,'%3D','=', [rfReplaceAll]);

Svaki put se ponovo izračunava stringList.Text i ponovo dodeljuje, koristi privremenu promenljivu umesto toga.


 
Odgovor na temu

reikonija
Faks<lll>
Visegrad

Član broj: 213271
Poruke: 121
*.teol.net.



+4 Profil

icon Re: Threadovi i Delphiju09.11.2011. u 17:32 - pre 151 meseci
Google mi je globalna promjenljiva , ako sam te dobro shvatio mislis da napravim lokalnu varijablu u okviru funkcije ili procedure i da joj dodijelim google a extract text funkcija je :

Code:
function ExtractText(const Str, Delim1, Delim2: string; PosStart: integer; var PosEnd: integer): string;
var
 pos1, pos2: integer;
begin
    Result := '';
    pos1 := PosEx(Delim1, Str, PosStart);
    if pos1 > 0 then
    begin
    pos2 := PosEx(Delim2, Str, pos1 + Length(Delim1));
    if pos2 > 0 then
    begin
      PosEnd := pos2 + Length(Delim2);
      Result := Copy(Str, pos1 + Length(Delim1), pos2 - (pos1 + Length(Delim1)));
end;
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Threadovi i Delphiju09.11.2011. u 19:52 - pre 151 meseci
> Google mi je globalna promjenljiva , ako sam te dobro shvatio mislis da napravim lokalnu varijablu u okviru funkcije ili procedure i da joj dodijelim google a extract text funkcija je :

Ono što ti predlažem je:

Code:


  Temp := google.Text
  ... // Sada uradi kakve god da ti obrade trebaju nad Temp a ne nad google.Text i na kraju
  google.Text := Temp;


Isto važi i za schecklistbox1.Items.Text.

 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Threadovi i Delphiju

[ Pregleda: 1462 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.