Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 5 odgovora
  • 2.575 pregleda

Najnovija ↓

Thread i otvranje tibdataset-a 12.06.2014. u 15:20 · pre 150 meseci #1
Imam cca 15 qry-a koje se otvaraja na početku programa i zahvačaju sve podatke (morat tako, ne pitajte zašto...)
Koristim TIBDataSet, u stvaru kontrol koja ne napravljena na TIBDataSet (dodati neki parakmetri, dodana interna transakcija, mogućnost select, orerder, join dijelova...)

Svi qry-i su mi na datamodulu, na njih su zakačene datastt-ovi i na ove grid-ovi

Pokušao sam napraviti otvaranje u zasebnim thread-ovima, ali ne prolazi...
Code:

  tm=class(TThread)
  private
     fq: TIBDataSetNew;
  protected
     procedure Execute; override;   
  public
     constructor Create(qry: TIBDataSetNew); 
  end;

constructor tm.Create(qry: TIBDataSetNew);
begin
  fq := qry;
  inherited Create(true);
  Resume;
end;

procedure tm.Execute;
begin
  if (fq <> nil) and not(fq.Active) then begin
     fq.Open;
  end;
end;


i u main formi gumb:

Code:

procedure TForm1.Button1Click(Sender: TObject);
begin
  if not ibd.Connected then ibd.Open;
 
  tm.Create(q1);
  tm.Create(q2);
end;


Što ne valja? Ponekad otvori oba qry-a, ponekad u jedno prikaže samo 1 field od njih 20-tak, poneka otvori samo jedan qry....
Re: Thread i otvranje tibdataset-a 12.06.2014. u 19:09 · pre 150 meseci #2
Ne mozes tek tako da prosledjujes pointere ka query objectima u thread, umesto toga napravi lokalni query objekat unutar threada, izvrsi query, i iz threada vrati rezultat glavnom threadu preko synchronize() ili PostMessage().
(mozda nisam u pravu jer vrlo slabo radim sa bazama, ali prosledjivanje VCL objekta threadu definitivno smrdi)
Re: Thread i otvranje tibdataset-a 13.06.2014. u 08:47 · pre 150 meseci #3
Iz onoga što sam čitao, i meni to nije baš ok, ali ne znam kako drugačije i da li uopće može to što sam zamislio.
Ne mogu kreirati novi qry u thread-u jer se na onaj koji mu prosljeđujem iz glavnog thread-a naslanjaju grid-ovi i još ponešto, a i koristim njegove AfterOpen, AfterScroll itd event-e
Re: Thread i otvranje tibdataset-a 13.06.2014. u 10:46 · pre 150 meseci #4
Mislim da sam našao rješenje. Ako mislite da nije uredu, molim savjet.

u thread sam dodao proceduru Open u koju sam prebacio otvaranje qry-a iz procedure Execute, a u proc Execute pozivam proceduru Open:
Code:


...
private
     procedure Open;
...
end;


procedure tm.Open;
begin
  if (fq <> nil) and not(fq.Active) then begin
     fq.Open;
  end;
end;

procedure tm.Execute;
begin
  Synchronize(Open);
end;


Idem to uglaviti u program pa da vidim razilku. Na testu s 2 tablice rezulat:
Open preko threada: 4-7 ms
Direktan open u formi: 65-75 ms

Re: Thread i otvranje tibdataset-a 13.06.2014. u 13:39 · pre 150 meseci #5
Citat:
Ne mogu kreirati novi qry u thread-u jer se na onaj koji mu prosljeđujem iz glavnog thread-a naslanjaju grid-ovi i još ponešto, a i koristim njegove AfterOpen, AfterScroll itd event-e


Onda je upravo to problem, mesas VCL u threadovima, a VCL nije thread-safe. A ovaj zadnji primer koji si naveo ne radi nista drugo nego izvrsava Open() u glavnom threadu, isti ces efekat dobiti i ako stavis fq.Open() u data modulu.

http://stackoverflow.com/quest...the-query-how-to-prevent-freez
Re: Thread i otvranje tibdataset-a 14.06.2014. u 20:14 · pre 150 meseci
izmenjeno 1 put, poslednji put savkic 14.06.2014. u 20:31
  1. savkic14.06.2014. u 20:31zapis iz teksta poruke
#6
Uvek kada radiš sa threadovima a posebno sa bazom i threadovima moraš voditi računa o više stvari, npr:
- nikada ne mešati i koristiti jedan resurs u više threadova, istovremeno, osim ako to nije eksplicitno dozvoljeno (npr, string je threadsafe)
- nikada ne pozivati resurs koji je u jednom threadu iz drugog, dakle da iz glavnog threada pozoveš neki dataset iz pomoćnog i da koristiš njegov resultset.

Natrag na tvoj problem

> Imam cca 15 qry-a koje se otvaraja na početku programa i zahvačaju sve podatke (morat tako, ne pitajte zašto...)
> Koristim TIBDataSet, u stvaru kontrol koja ne napravljena na TIBDataSet (dodati neki parakmetri, dodana interna transakcija, mogućnost select,
> orerder, join dijelova...)

> Svi qry-i su mi na datamodulu, na njih su zakačene datastt-ovi i na ove grid-ovi
> Pokušao sam napraviti otvaranje u zasebnim thread-ovima, ali ne prolazi...

To ne može tako, nekoliko stvari, moraš videti da li je uopšte IBX thradsafe (koliko se sećam, nije), ako nije onda za svaki objekat (dataset) u posebnom threadu moraš imati posebnu DB konekciju ovako ti ako staviš datasetove u poseban thread oni svi koriste isti main thread db connection objekat. Drugo nikako nemoj da to radiš dok je dataset zakačen na db aware kontrole.

Kao opšte pravilo (ima i izuzetaka) threadovi se kod pristupa bazi koriste da ubrzaju neke operacije, tipa generisanje izveštaja, kalkulacije i slično što zahteva dosta vremena. Ali se nekoriste za ubrzavanje pregleda podataka. Ako imaš problem sa sporim prikazom podataka onda gledaj da optimizuješ svoje kverije, da ih filtriraš i slično.
Potpis
Do not be a help vampire (http://slash7.com/pages/vampires), use the google.

How to ask questions the smart way:
http://www.catb.org/~esr/faqs/smart-questions.html
http://solair.eunet.rs/~fangor...stions/smart-questions.sr.html
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme