• 21 odgovora
  • 6.639 pregleda
Izvrsavanje u pozadini... Kako ? 10.10.2004. u 15:08 · pre 268 meseci #1
Program treba da izvrsi jednu operaciju koja ce trajati duze vreme... Koji je najboji nacin da napravim da se to izvrsava a da program i dalje nesmetano radi druge zadatke. (osim Application.ProcessMessages i Application.OnIdle)...
CreateThread ?
Re: Izvrsavanje u pozadini... Kako ? 10.10.2004. u 17:08 · pre 268 meseci #2
Imas TThread klasu...file|new|other|thread object... Ja sam pravio da mi muzika ide u pozadini i radilo je ok.
Re: Izvrsavanje u pozadini... Kako ? 11.10.2004. u 17:39 · pre 268 meseci #4
Mozes da koristis CreateThread() funkciju.
Prvo napises funkciju koja ce se izvrsavati u posebnoj niti.

var
ThreadId : Cardinal;

function ThreadProc(p : Pointer) : DWORD; stdcall;
begin
while TRUE do
begin
Sleep(100);
end;
end;

Zatim pozoves CreateThread() i predas pokazivac na ThreadProc().

CreateThread(nil, 0, @ThreadProc, nil, 0, ThreadId);

Obrati paznju da iz ThreadProc ne mozes kontrolisati korisnicki interfejs bez neke sinhronizacije jer vecina VCL klasa nije thread safe.

Potpis
Slavisa
Re: Izvrsavanje u pozadini... Kako ? 11.10.2004. u 18:26 · pre 268 meseci #5
Meni se podize debugger i javlja access violation gresku... Gde gresim ??? Inace, ThreadProc funkcija poziva jos nekoliko sporednih funkcija koje se sadrze u kodu... ?
Re: Izvrsavanje u pozadini... Kako ? 11.10.2004. u 18:37 · pre 268 meseci #6
Pretpostavio sam

Pokusaj prvo da u ThreadProc() stavis neko jednostavno procesiranje recimo

while TRUE do
begin
MessageBox(0, 'hehehe', 'hehehe', MB_OK);
Sleep(2000);
end;

To bi trebalo da radi bez gresaka.
Imaj u vidu da iz ThreadProc() ne mozes da uradis nesto tipa
Form1.Edit1.Text := 'blablabla';
jer ce to izazvati AccessViolation. Moras implementirati neki tip sinhronizacije
ili koristiti Win API za komuniciranje sa kontrolama forme.
Najbolje da zalijepis ovde tu ThreadProc()


Pojasni malo sta tacno hoces da izvrsavas u pozadini. Neki upit nad bazom podataka ili sta ?

Potpis
Slavisa
Re: Izvrsavanje u pozadini... Kako ? 11.10.2004. u 19:15 · pre 268 meseci #7
Nikakav upit, vec dekriptovanje fajla (pravim exe protector)... Aplikacija je konzolnog tipa... Funkcija poziva nekoliko razlicitih decrypt procedura...
Re: Izvrsavanje u pozadini... Kako ? 11.10.2004. u 21:02 · pre 268 meseci #8
E ovako, ponekad (retko kad) izbacuje gresku 'Invalid pointer operation', u vecini slucajeva je access violation...
I nema neko odredjeno mesto gde se greska pojavljuje, ponekad se pojavi odmah nakon izvrsenja tek 3-4 naredbe, negde se pojavi pred kraj funkcije...
Re: Izvrsavanje u pozadini... Kako ? 11.10.2004. u 21:33 · pre 268 meseci #9
Ne mogu ti na pamet nista reci. Pokreni program kroz debugger pa prati liniju po liniju koda.
Potpis
Slavisa
Re: Izvrsavanje u pozadini... Kako ? 11.10.2004. u 21:59 · pre 268 meseci #10
Prvo moras da verifikujes kod koji radi taj posao (koji god), znaci kako radi bez upotrebe niti. Zatim taj kod ubacujes u nit, ali koristi TThread klasu a ne API pozive. Pa da vidimo kako ide...
Re: Izvrsavanje u pozadini... Kako ? 11.10.2004. u 22:25 · pre 268 meseci #13
Naravno da moze samo treba da otkrijes gdje grijesis :)
TThread ima ugradjene mehanizme za sinhronizaciju pa vjerovatno zato nisi imao problema. Zasto uopste hoces da koristis API ako TThread vec radi.
Potpis
Slavisa
Re: Izvrsavanje u pozadini... Kako ? 11.10.2004. u 22:38 · pre 268 meseci #14
Zbog manje velicine izkompajliranog fajla... Da ne tupim sad, ali se program dodaje na pocetku programa koji treba da se zastiti i potrebno je da bude sto manji i blablabla
Re: Izvrsavanje u pozadini... Kako ? 12.10.2004. u 07:39 · pre 268 meseci #15
Ako koristis API onda obavezno postavi varijablu IsMultiThread na True.
Ako to ne uradis Delphi nece znati da postoji vise threadova i nece koristiti thread-safe kod tamo gde je potreban (alokacija memorije na primer).
Re: Izvrsavanje u pozadini... Kako ? 12.10.2004. u 10:20 · pre 268 meseci #16
A sta je problem sa Application.ProcessMessages? Usporava aplikaciju?

Samo napravi kod koji ce da to poziva relativno retko, recimo svaki stoti put kada se izvrsi neka iteracija i neces u Windowsu ni primecivati da radi.
Re: Izvrsavanje u pozadini... Kako ? 12.10.2004. u 10:53 · pre 268 meseci #17
Vec je napomenuo da je aplikacija konzolnog tipa, znaci nema Application objekta...Mozemo mi do sutra da razglabamo ako ne znamo kako vrsi sinhronizaciju radne niti i glavne niti programa, i sta jos koristi sto ne sme. Tu potencijalno lezi problem. A i sta mu znaci "dodaje se na pocetku programa": dodaje se na exe na exe ili se ovo izvrsava pre glavnog koda jednog exe-a?

Takodje sta znaci da program bude sto manji? Koliki ti je sa TThread, a koliki sa API funkcijama? Nemoj da cepidlacis, ne pises programe za Spectrum :)
Re: Izvrsavanje u pozadini... Kako ? 12.10.2004. u 11:51 · pre 268 meseci #18
Hm da, prevideo sam da se radi o konzolnoj aplikaciji.

Princip je isti, samo se ne korsiti VCL, al da me ubijete sad ne moguda se setim kako iako sam to koristio.

Trebalo bi napisati sopstveni hendler za Windows poruke, sto nije nesto komplikovano pa preusmeravati na Windowsov hendler sve sto se nas ne tice.

Treba pretraziti malo net po kljucnoj reci DefWindowProc, sigurno ima gotovih primera.
Re: Izvrsavanje u pozadini... Kako ? 12.10.2004. u 14:13 · pre 268 meseci #19
Resio sam problem !
Umesto CreateThread() sam stavio BeginThread() i sve radi kako treba (BeginThread u stvari samo stavlja IsMultiThread na TRUE)...
Sad jos jedno pitanjce... Kako da potpuno oslobodim thread ? Da stavim samo ExitCode(0) na kraju thread funkcije ili jos nesto ?

poz
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme