Toon posts:

[Alg] Venster controls a.d.v. status

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi allemaal!

Ik zit met een vraag waar ik een al een poos mee zit. Ik jaar of wat geleden een zoek programma gemaakt waarbij op inhoud van bestanden gezocht kan worden maar ook naar bestandsnamen en dergelijke.

Nu leek het mij leuk dit "project" opnieuw te gaan schrijven met alle kennis die ik nu heb en het werkt allemaal lekker en ben blij toe dat ik het gedaan heb, omdat de kwaliteit van de code een stuk hoger ligt dan het was. Waar ik voorheen alles in de CodeBehind pleurde heb ik nu een mooie SearchEngine class geschreven die verantwoordelijk is voor het zoeken en geeft resultaten terug.

Nu ben ik met wat zaken in aanraking gekomen en weet niet goed of ik de juiste weg op ben gegaan:

1. Mijn eerste gedachte was een methode te maken die resultaten terug geeft. Probleem hierbij was direct al het feit dat de resultaten pas toegevoegd werden wanneer de resultaten terug gegeven werden.

code:
1
public SearchResults[] SearchFiles(....) { }



Als je bijvoorbeeld je C-schijf helemaal door wilt zoeken houd dat in dat je misschien wel 1+ uur niets op het scherm ziet :o (wat uiteraard niet de bedoeling is). Ik heb dit opgelost door een event te maken OnFileFound die het resultaat terug geeft. Ik heb dit event gebruikt in de CodeBehind om de datagrid up te daten wanneer een resultaat gevonden is. Mijn vraag: Is dit een goede manier?

2. Een ander probleem wat ik had was response tijd. Pas als er een bestand gevonden is doe ik Application.DoEvents() om weer leven in de brouwerij te brengen. Echter als er dus niets gevonden wordt zal de applicatie "dood" zijn (aka. reageert niet). Dit heb ik opgelost door een tweede event te maken OnDirectoryScanned die bij elke directory een seintje geeft aan de mogelijke listeners. In de CodeBehind zal ik vervolgens weer Application.DoEvents() aanroepen om de boel weer tot leven te wekken. Nu zou ik dit ook nog voor OnFileScanned moeten doen. Is dit correct of is er een slimmere manier voor te vinden?

3. Als bestanden ontzettend groot zijn, bijvoorbeeld binary bestanden (iso's, img, etc) dan weet mijn bestand niet dat het een binair bestand is. Dit maak in zoverre uit, dat als iemand "in" de bestanden wil zoeken de response tijd daar verkracht wordt omdat hij nooit FileScanned of DirectoryScanned aanroept (daar komt hij simpel weg niet omdat hij het bestand aan het uitlezen is). Nu zou ik hier dus weer een of ander event voor moeten maken om dit op te lossen (OnFileProcessing ofzo). Het lijkt mij dat ik iets over het hoofd zie?

4. Ik wil een stabiele eenduidige manier om het venster aan de hand van de SearchEngine status te positioneren. Als ik bijvoorbeeld op "search" druk dan komt er een "stop" knop. Als hij klaar is met zoeken dan veranderd dit automatisch weer naar "search". Ik heb rond gekeken en in principe lijkt mij dat het State Pattern een mooie manier hier voor is. Op deze manier kan ik namelijk volgens mij ook onjuistheden voorkomen en bugs dus vermijden. Stel dat ik op "stop" druk en de state veranderd naar "stopped". Als de button dan niet verdwijnt wil dat dus zeggen dat de huidige status "stopped" is en ik zou een exceptie kunnen throwen in de StoppedSearchEngineState class wanneer er weer op stop gedrukt wordt. Op deze manier kunnen er dus nooit acties gebeuren die nooit mogen gebeuren. In mijn voorbeeld maakt dit niet zoveel uit maar als je een webshop of iets maakt zou het wel eens anders af kunnen lopen.

5. Het MVC model wordt binnen Java veel gebruikt voor het veranderen van de layout van het scherm aan de hand gebeurtenissen. Omdat .NET anders in elkaar steekt vraag ik mij daarom af of ik hier naar moet gaan kijken of niet. Het observer gedeelte binnen Java kan in mijn gedachte goed met delegates / events afgehandeld worden.

6. Met het State Pattern zat ik er aan te denken public readonly properties aan te maken die de controls vertellen hoe ze gerendered moeten worden. Denk aan:

code:
1
2
3
protected bool searchButtonIsVisible = false;

public bool SearchButtonVisible { ... }


In de abstracte state class kunnen al de protected variables vervolgens gezet worden naar de juistheid. Per state heb je dus perfect in beeld hoe de layout er uit dient te zien. Iemand hier ervaringen mee?

7. Zijn er andere design patterns die ik over het hoofd gezien heb of misschien geen pattern maar wel een goede manier om mijn probleem m.b.t. tot de layout te veranderen a.d.h.v. de status van in mijn geval de SearchEngine?


Alvast hartelijk dank!

  • SPee
  • Registratie: Oktober 2001
  • Laatst online: 13-02 11:29
1. Dit kan goed werken. Je zou ook eventueel een queue kunnen gebruiken.
2. Ik zou gaan voor een thread die de bestanden zoekt.
Dan behoudt de front-end nog zijn responsiviteit.
3. Kun je de grote bestanden dan niet overslaan, zodat je daar binnen niet kan zoeken?
4. geen opmerkingen over. Als je een thread gebruikt, zou je er ook voor kunnen kiezen om te kijken of deze nog loopt of niet.
5. Mag je zelf weten. Het is wel een stuk anders dan Java en je zult zeker weer dingen moeten uitzoeken.

let the past be the past.


Verwijderd

Topicstarter
SPee schreef op vrijdag 18 augustus 2006 @ 17:45:
1. Dit kan goed werken. Je zou ook eventueel een queue kunnen gebruiken.
2. Ik zou gaan voor een thread die de bestanden zoekt.
Dan behoudt de front-end nog zijn responsiviteit.
3. Kun je de grote bestanden dan niet overslaan, zodat je daar binnen niet kan zoeken?
4. geen opmerkingen over. Als je een thread gebruikt, zou je er ook voor kunnen kiezen om te kijken of deze nog loopt of niet.
5. Mag je zelf weten. Het is wel een stuk anders dan Java en je zult zeker weer dingen moeten uitzoeken.
Hartelijk dank voor je reactie :)

2. Ik heb over threads nagedacht maar wat een bollock moet je allemaal meenemen wil je het een beetje in orde houden! Tenminste dat dacht ik tot ik vandaag op een heel goed artikel ben gestuit.

Wat ik eerst deed:

code:
1
2
3
4
5
6
7
8
if (!InvokeRequired)
{
   control.Text = "test";
}
else
{
   control.Invoke( ... );
}


Dit is echt een drama en kon me bijna niet voorstellen dat er geen schonere manier te vinden was :/. Na veel zoeken heb ik een mooie oplossing gevonden.

http://www.codeproject.com/useritems/SyncContextTutorial.asp

Alleen.... mijn UI is niet responsive :P. Ik had verwacht (en zou ook logisch moeten zijn) dat de UI nu gewoon door bleef draaien.

code:
1
2
3
4
5
SearchSynchronizationContext context = new SearchSynchronizationContext(this);
ThreadStart threadStart = new ThreadStart(context.StartSearch);
Thread thread = new Thread(threadStart);
thread.Priority = ThreadPriority.Lowest;
thread.Start();


Heb getracht de prioriteit omlaag te gooien maar dat helpt helaas niet. Zal kijken of ik erachter kan komen waarom hij nog steeds mijn UI thread blockt.

3. Ja tuurlijk kan dat, maar wie vertelt me of de gebruiker niet toevallig een 10 mb+ tekst bestand heeft staan. Erg onwaarschijnlijk maar ik kijk liever of er een manier te vinden is om te kijken of een bestand een binary is of niet.


Trouwens een kleine update over het state pattern. Werkt best wel goed nu en heb de UI totaal in controle nu! Heb nog niet veel kunnen testen i.v.m. de UI die nog steeds geblockt wordt maar het lijkt er op of ik nu de totale macht heb en per state het gehele scherm kan aanpassen :D.