Poslao: 20 Jun 2006 13:48
|
offline
- bobby
- Administrator
- Pridružio: 04 Sep 2003
- Poruke: 24135
- Gde živiš: Wien
|
Imam thread koji posmatra promene u folderu i subfolderima, i salje evente kada se nesto promeni.
Ukoliko na formu postavim ListBox (lstEvents), sledeca procedura radi:
procedure TfrmMain.DirWatch1FileDeleted(Sender: TObject;
const FileName: String);
begin
self.lstEvents.AddItem('File Deleted: ' + FileName, Nil);
self.lstEvents.TopIndex := self.lstEvents.Items.Count - 1;
end;
Ukoliko na formu postavim prvo PageControl, i ListBox na jednoj od stranica PageControla - procedura nece da izazove upis u ListBox.
Sledeca procedura (iz istog programa) radi u oba slucaja:
procedure TfrmMain.DirWatch1DirWatchStarted(Sender: TObject;
const DirName: String; const WatchSubFoders: Boolean);
begin
self.lstEvents.Clear;
self.lstEvents.AddItem('Started Directory Watch', nil);
end;
Probao sam u prvoj proceduri da odradim i Refresh i Invalidate, i ListBoxa i PageControla, i nista ne pomaze.
Gde gresim?
|
|
|
Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
|
|
Poslao: 20 Jun 2006 14:04
|
offline
- Srki_82
- Moderator foruma
- Srđan Tot
- Am I evil? I am man, yes I am.
- Pridružio: 12 Jul 2005
- Poruke: 2483
- Gde živiš: Ljubljana
|
Hajde postavi ceo projekat s minimalno koda koji reprodukuje tvoj problem pa cemo da vidimo... sve deluje ok ovako na prvi pogled.
|
|
|
|
Poslao: 20 Jun 2006 14:16
|
offline
- bobby
- Administrator
- Pridružio: 04 Sep 2003
- Poruke: 24135
- Gde živiš: Wien
|
https://www.mycity.rs/must-login.png
Imas tu i komponentu zajedno sa Demo projektom, i moj test projekat.
Na Open File u meniju bi trebao da pocne sa primanjem evenata od komponente. Odaberi bilo koji fajl, za sada nema ulogu.
U Editu dole upises folder koji da prati (prati i subfoldere).
Ukoliko ListBox prebacim iz PageControla u onaj Panel dole - onda radi.
|
|
|
|
Poslao: 20 Jun 2006 15:01
|
offline
- Srki_82
- Moderator foruma
- Srđan Tot
- Am I evil? I am man, yes I am.
- Pridružio: 12 Jul 2005
- Poruke: 2483
- Gde živiš: Ljubljana
|
Nisam mnogo zagledao program... kada ne koristim tvoju komponentu (list box punim kada kliknem na dugme) onda sve radi kako treba.
Tvoja komponenta, koliko sam video, poziva event iz thread-a koji nije glavni i time je i procedura vezana za taj event u tom istom thread-u. VCL komponente ne rade bas kako treba kada se njihovim svojstvima i metodama pristupa iz nekog drugog thread-a i mislim da je u tome problem.
Pogledacu jos malo kod komponente kad budem dosao kuci, ali sam prilicno siguran da je u tome problem.
|
|
|
|
Poslao: 20 Jun 2006 17:29
|
offline
- beli0135
- Executor
- Pridružio: 03 Jan 2005
- Poruke: 2990
- Gde živiš: Beograd
|
Bobby, nemam sada vremena da analiziram tvoj ZIP, ali uzimajuci u obzir 90% kad se to deshava, a i tvoj predhodni problem,
mogu da sugerisem da pogledas kojoj instanci thread-a pristupas.
Thread je obicno dizajniran da se vrti dok ne zavrsi pa se samoubije. Moguce da pristupas nekom drugom thread-u a da mislis da je isti.
|
|
|
|
Poslao: 20 Jun 2006 18:36
|
offline
- bobby
- Administrator
- Pridružio: 04 Sep 2003
- Poruke: 24135
- Gde živiš: Wien
|
DirWatch je komponenta (sa Torry.net-a) kojoj zadajem koji folder da posmatra, i kada dodje do promene daje mi Notify evente.
Ja samo napisem procedure za svaki Notify event (FileChanged, File Deleted itd.)
Da ja pristupam pogresnoj instanci ne bih rekao jer isti ListBox prebacim sa PageControla na Panel na formi i tu radi, ukoliko ListBox vratim na PageControl - tu ne radi.
Da li je moguce da je problem do toga sto komponenta salje Notify evente preko Windows Handle, i da taj Handle jednostavno ne nalazi PageControl?
|
|
|
|
Poslao: 20 Jun 2006 20:18
|
offline
- beli0135
- Executor
- Pridružio: 03 Jan 2005
- Poruke: 2990
- Gde živiš: Beograd
|
Verovatno:
U pitanju su uvek windows handle
windows_handle1 = pageContro.create
windows_handle2 = ListBox.create
onda delfi dodaje handlove unutar komponente
PageControl.Handle := windows_handle1
ListBox.handle := windows_handle2
Ako prosledis windows_handle2, on MORA da ti nadje ListBox. Ukoliko ne nadje, Listbox je bio ubijen u medjuvremenu, i handle otpusen ili dodeljen nekom drugom.
Zato ti kazem da verovatno instance nisu iste ili negde brljas sa handlovima.
Inace, ne razumem, cemu toliki threadovi?
Ako vec pravis nesto da kontrolise promene u registru, treba da bude service, jedan thread, i da lovi windows poruke.
Ako pak to zelis da imas u aplikaciji, onda treba da ima samo jedan thread koji ce samo da lovi odgovarajuce poruke i da kad naleti na zeljenu, uradi Synchronize...
BTW, zasto pravis thread u komponenti?
|
|
|
|
Poslao: 20 Jun 2006 20:35
|
offline
- bobby
- Administrator
- Pridružio: 04 Sep 2003
- Poruke: 24135
- Gde živiš: Wien
|
Cek, cek.
Program treba da posmatra sledece promene na sistemu:
- nove, izmenjene ili obrisne fajlove
- promene u reg. bazi
- snifuje internet konekciju
Za prvu i trecu stavku sam nasao solucije:
- za promene na fajl-sistemu sam nasao komponentu DirWatch
- za snifovanje mreze imam par primera kako koristiti WinPCap drajver
Zamislio sam da svaka od ovih celina ima svoju stranicu na PageControl komponenti. Problem je sto DirWatch ne salje Notification evente ListBoxu koji sluzi za logovanje promena na file-sistemu.
Nisam ja petljao ni sa kakvim threadovima, samo sam napisao procedure koje dodaju linije u ListBox u zavisnosti od Notification eventa koji dobijem od DirWatch komponente.
Problem je sto, kada ListBox stavim direktno na formu - sve radi i beleze se promene na fajl-sistemu. Kada komponentu samo premestim na PageControl koji se nalazi na istoj formi - ListBox ostaje prazan, nista od promena na sistemu ne bude zabelezeno. Nista od programskog koda ne menjam, samo prebacujem ListBox sa Forme na PageControl na istoj formi.
Jos jednom, komponentu DirWatch nisam ja napisao, skinuo sam je sa neta, i za sada je jedina koju sam nasao da vraca i path/ime fajla na kome se desila promena, sve ostale samo signaliziraju da je doslo do promena i nista vise (ne kazu na kom fajlu se desila promena).
Za promene na reg. bazi jos uvek nemam nikakvu soluciju...
|
|
|
|
Poslao: 20 Jun 2006 21:42
|
offline
- beli0135
- Executor
- Pridružio: 03 Jan 2005
- Poruke: 2990
- Gde živiš: Beograd
|
Jednostavno ne popunjavas listbox kako treba, tj lose referenciras.
Nista strasno.. odspavaj, pa onda zna se... F5 i F8,F7 i CTRL+F7 i to je keva!
|
|
|
|
Poslao: 21 Jun 2006 07:09
|
offline
- Srki_82
- Moderator foruma
- Srđan Tot
- Am I evil? I am man, yes I am.
- Pridružio: 12 Jul 2005
- Poruke: 2483
- Gde živiš: Ljubljana
|
Hmmmm... pogledao sam malo kod komponente i sve deluje ok. Eventi se ne zovu iz thread-a nego se samo salje WM koju komponenta hvata u glavnom thread-u i odatle poziva funkcije vezane za thread.
Probacu malo da debugnem programcic... welcome to the twilight zone
|
|
|
|