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

problem sa updejtom forme pri izvršavanju procesa

[es] :: Pascal / Delphi / Kylix :: problem sa updejtom forme pri izvršavanju procesa

[ Pregleda: 1995 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

TezVi
Planet Earth

Član broj: 17074
Poruke: 67
*.cmu.carnet.hr.

ICQ: 121703076
Sajt: www.symbian-mobile.org


Profil

icon problem sa updejtom forme pri izvršavanju procesa13.01.2005. u 17:25 - pre 234 meseci
ok, imam jedna problemčić koji me muči u Delphiju 7... napravio sam josh prije godinu dana jedan program za koji sad pišem update... naime, razvio sam jedan dio programa, točnije wizard koji iz određenog foldera skenira sve foldere i fajlove određene ekstenzije iz tih foldera... te fajlove otvori i podatke (tekst) prebacuje u mem... ok, čisto za uvod...



Code:
    

if FindFirst(Path+DirName, faDirectory, SR) = 0 then
      if length(SR.Name)=5 then
      if midstr(SR.Name,3,1)='-' then
        begin
          if FindFirst(Path+SR.Name+'\*.*', faDirectory, SR2) = 0 then
            begin
              repeat
                if (length(SR2.Name)>=2) and (SR2.Name<>'..') and (SR2.Attr=faDirectory) then
                  begin
                     imerazr:=ConvertFolderName(SR2.Name);
                     AddRazred(leftstr(imerazr,length(imerazr)-2),rightstr(imerazr,1),'','','');
                     brRazr.Caption:=inttostr(strtoint(brRazr.Caption)+1);
                     if FindFirst(Path+SR.Name+'\'+SR2.Name+'\*.dat',faAnyFile, SR3) = 0 then
                      begin
                        repeat
                          if SR3.Attr<>faDirectory then
                            begin
                              if abort then
                                begin
                                  label18.Caption:='Proces prekinut...';
                                  Progress.Visible:=false;
                                  lblKraj.Visible:=true;
                                end;
                              Progress.position:=Progress.position+1;
                              lblPath.Caption:=path+DirName+'\'+SR2.Name+'\'+SR3.Name;
                             
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////

                            //OVDJE POKUŠAVAM SA update procedurama
                              lblPath.Update;
                              pisdatform.Update;
                            /////////////////////////
                            
                            // OVDJE ide glavni dio posla -> funkcija LoadUcenikFromDat otvara fajl i učitava....
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////

                              if LoadUcenikFromDat(ConvertFolderName(SR2.Name),path+DirName+'\'+SR2.Name+'\'+SR3.Name) then
                                brUc.Caption:=inttostr(strtoint(brUc.Caption)+1)
                              else
                                brFailed.Caption:=inttostr(strtoint(brFailed.Caption)+1)
                            end;
                        until FindNext(SR3) <> 0;
                        FindClose(SR3);
                      end;
                  end;
              until FindNext(SR2) <> 0;
              FindClose(SR2);
            end;
        end;
    FindClose(SR);



ovdje ima dosta koda unutar petlji tako da sam samo izrezao onaj dio gdje se refreshaju forme...

E sad, problem je u tome što se nakon desetak sekundi odrađenog posla petlje forma "zamrzne" isto kao i Cancel button. Ovaj problem sam rješavao u VB6 sa DoEvents procedurom, pa stoji pitanje: ima li kakva alternativa u Delphiju... na koji način da to rješim...? Ubacio sam u petlju form.update proceduru... to mi osvježava progressbar i labele, ali za buttone ne šljaka...

znači želio bih da mogu kliknuti buttone dok je form "busy" tako da mogu prekinuti proces i da se forma ne zamrzava (not responding).

ima li tko kakav prijedlog?

 
Odgovor na temu

_v!rus_
BGD

Član broj: 40451
Poruke: 313
*.verat.net.



+1 Profil

icon Re: problem sa updejtom forme pri izvršavanju procesa13.01.2005. u 17:37 - pre 234 meseci
Najlakse resenje je da koristis Application.ProcessMessages u petlji, neznatno usporava ali i sve osvezava. A za prekid napravi global var npr. Canceled: Boolean i u ButtonCancel.OnClick event napisi Canceled := True. Onda u okviru neke od petlji (pametno odredi u okviru koje) daj if Canceled then Something odmah ispod Appliction.ProcessMessages. Ovo je jeftinije od pravljenja threada za tako malu potrebu, ali je za nijansu nepreglednije jer gledajuci samo u petlju Canceled se nigde ne menja (u petlji) a ipak mu se ispituje stanje (if Canceled) mada to i nije tako strasno sobzirom da je za internu upotrebu.
 
Odgovor na temu

TezVi
Planet Earth

Član broj: 17074
Poruke: 67
*.net.t-com.hr.

ICQ: 121703076
Sajt: www.symbian-mobile.org


Profil

icon Re: problem sa updejtom forme pri izvršavanju procesa13.01.2005. u 19:10 - pre 234 meseci
za prekid sam i koristio istu zamisao.. možeš vidjeti u kodu odmah iznad komentara, varijabla abort

Code:

if abort then
  begin
     label18.Caption:='Proces prekinut...';
     Progress.Visible:=false;
     lblKraj.Visible:=true;
  end;



ali nisam znao za application.processmessages...

thx man, sad radi za 5
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: problem sa updejtom forme pri izvršavanju procesa13.01.2005. u 20:13 - pre 234 meseci
Probaj da radis sa threadovima.. Mislim da je to najbolje resenje... Opali jedan BeginThread() i to je to.
 
Odgovor na temu

TezVi
Planet Earth

Član broj: 17074
Poruke: 67
*.cmu.carnet.hr.

ICQ: 121703076
Sajt: www.symbian-mobile.org


Profil

icon Re: problem sa updejtom forme pri izvršavanju procesa14.01.2005. u 01:18 - pre 234 meseci
baš sam gledao po helpu za threadove, malo su škrti sa primjerima... ima možda netko light primjer korištenja threadova za podijeliti?

šljaka mi prog i ovako, ali htio bih i threadove probati...
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: problem sa updejtom forme pri izvršavanju procesa14.01.2005. u 02:04 - pre 234 meseci
Veoma prosto :

Code:
BeginThread(nil, 0, @NekaFunkcija, nil, 0, threadID);


A @NekaFunkcija ti je pokazivac na obicnu funkciju/proceduru koja vrsi glavni posao, tj. skeniranje.

Code:
procedure NekaFunkcija; stdcall;


Jos ako hoces mozes sa SetThreadPriority da dodelis tom threadu neki visi/nizi status...

Znaci kako bi to izgledalo :

Code:

var
  threadID : Cardinal;

procedure NekaFunkcija; stdcall;
begin
// Ovde nesto radimo
end;

procedure TForm1.Button1Click(Sender : TObject);
begin
  BeginThread(nil, 0, @NekaFunkcija, nil, 0, threadID);
end;



Mada imas i jos nekoliko razlicitih pristupa threadovima, ti vidi koji ti je najlaksi, recimo File -> New -> Other -> Thread Object....
 
Odgovor na temu

TezVi
Planet Earth

Član broj: 17074
Poruke: 67
*.cmu.carnet.hr.

ICQ: 121703076
Sajt: www.symbian-mobile.org


Profil

icon Re: problem sa updejtom forme pri izvršavanju procesa14.01.2005. u 14:30 - pre 234 meseci
Thx
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: problem sa updejtom forme pri izvršavanju procesa

[ Pregleda: 1995 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

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