Nisam pametan...

1

Nisam pametan...

offline
  • 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.
offline
  • 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.



offline
  • 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.

offline
  • 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.

offline
  • Emil Beli
  • 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.

offline
  • 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?

offline
  • Emil Beli
  • 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?

offline
  • 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...

offline
  • Emil Beli
  • 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!

offline
  • 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 Smile

Ko je trenutno na forumu
 

Ukupno su 1065 korisnika na forumu :: 1 registrovan, 0 sakrivenih i 1064 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: pacika