Šta je novo?

Windows/Delphi iscrtavanje forme

ivan021

Čuven
Učlanjen(a)
01.02.2004
Poruke
3
Poena
601
Program otvori prozor sa par dugmica, edit poljem, i jednim listboxom, podaci se unesu, i zatim pozovem proceduru za izracunavanje. Kalkulacija traje prilicno dugo, a za to vreme sadrzaj prozora se ne iscrtava. Ukoliko predjem nekim drugim prozora preko njega, ostane "mrlja" sve dok ne izadjem iz procedure i eksplicitno pozovem Repaint. U principu isto ponasanje kao i klasicni calc.exe, kada se zada poveci broj za racunanje faktorijela :)

Kako naterati prozor da iscrtava svoje komponente i za vreme kalkulacije?
Da lansiram jedan thread za kalkulaciju, a main thread da ceka u loopu i radi repaint? :) Mora postojati neko bolje resenje?
 
Ne trebaju ti dodatni threadovi, samo u loopu za obradu ubaci:

Application.ProcessMessages;
 
Pa, nije baš da mu nisu potrebne...

Zavisi šta treba da se dogodi: ako hoćeš da se iscrtava bez pogovora kad god prozor dobio fokus, thread je pravo rešenje; ako, sa druge strane, ciklus obrade ne može da traje dugo, onda je ok i ProcessMessages predlog. Thread bi bio elegantnije rešenje, čini mi se, jer bi u tom slučaju mogao da napraviš dugme za prekid računanja, na primer.
 
Odradio sam problem lansiranjem thread-a za kalkulaciju, dok main ceka i radi HandleMessage.
Nego, nesto ne plivam najbolje u ovom delphiju:
- kako cekate kraj thread-a? Ja sam koristio OnTerminate event koji mi poziva odgovarajucu proceduru.
- kako sinhronizujete vise thread-ova? Vidim da je SyncObjs prilicno ne-bogat klasama :) Meni je bilo potrebno da i ogranicim max broj threadova koji se vrte, pa sam napravio Semaphore klasu (pomocu TCriticalSection & TEvent), koje resenje vi koristite, tj. da li postoji nesto vise u duhu delphija - znaci ugradjene klase/metode?
 
Tesko da tu nesto zavisi od duha delphija, vec vise od duha windowsa :)
Vecina klasa ionako predstavlja wrappere oko windowsovih sistemskih funkcija, tako da mozes da radis direktno i sa winapijem ako ti je tako lakse ili si tako navikao.
Hendlovanje uobicajeno za delphi je sledece:

1. TCriticalSection je normalan za niti koje traze normalan nivo paralelizma sa zastitom pristupa memoriji, itd. Default znaci.
2. Ukoliko ti ne treba takav nivo zastite, vec samo za pisanje, imas TMultiReadExclusiveWriteSynchronizer (check that spelling); name says all
3. Pojedine klase sa specificnom namenom mogu da koriste svoj ugradjeni locking; tcanvas recimo, kao wrapper oko devicecontexta. Za sinhronizaciju threadova tada mozes da koristis i jedan poseban thread koji obradjuje TThreadList.

Zavrsavanje rada threada mozes da uradis sa njegovom WaitFor metodom (ima je bas kao i TEvent) - nakon toga biva automatski pozvana OnTerminate. S tim da ukoliko koristis WaitFor dobijas i rezultat kako je thread zavrsio (normalno, abortovan, itd), da bi korektno sinhronizovao ostale threadove. Naravno, ukoliko koristis i suspend i resume, moras sam da implementiras kontrolu u tim slucajevima - najlakse preko TThreadList klase. Imas takodje i neke dodatne funkcije za thread management - beginthread(), endthread(), foregroundtask(), itd.
Jedini _pravi_ problem jeste znati koje klase u frameworku (VCL, CLX, itd) su thread safe, a koje nisu.
 
Poslednja izmena:
Nazad
Vrh Dno