Строка состояния

  • Автор темы kaa
  • Дата начала
K
#1
Есть цикл в котором перебираются каталоги,
хотелось бы чтоб на форме отражался каталог в
котором ведется поиск.
Подскажите!!!:p
 

vital

Больной Компом Детектед
29.01.2006
2 432
33
#2
Для начала покажи как ты перебираешь каталоги. Есть тысячи версий и, соответственно, тысячи решений твоей траблы. Я думаю у тебя перебор каталогов обычными findfirst,findnext,findclose. Тогда я пробелмы не вижу. Ты ведь и так передаешь какой-то каталог функциям, значит он тебе известен.
 
S

Silver Wind

#3
Вообще-то рекомендуется такие длительные операции как сканирование каталогов запихивать в отдельный поток, ну а отображение каталога, в котором сейчас идет поиск в основном потоке программы по таймеру.
 
K
#4
<!--QuoteBegin-Silver Wind+1:10:2007, 01:30 -->
<span class="vbquote">(Silver Wind @ 1:10:2007, 01:30 )</span><!--QuoteEBegin-->Вообще-то рекомендуется такие длительные операции как сканирование каталогов запихивать в отдельный поток, ну а отображение каталога, в котором сейчас идет поиск в основном потоке программы по таймеру.
[snapback]80134" rel="nofollow" target="_blank[/snapback]​
[/quote]

Немогли бы вы привести пример.
Заранее спасибо
 
S

Silver Wind

#5
Стандартная демка по работе с потоками:
X:\Borland\Delphi7\Demos\Threads\
+ найди какую-нибудь доку по работе с потоками.

Что-нибудь на подобие того, что тебе надо можно примерно сделать так:
1. File\New\Aplication
2. File\New\Other... -> ThreadObject, на вопрос о названии класса вводишь чтонибудь типа TScanThread
Получился модуль с заготовкой для объекта.
3. В этом объекте добавляешь новое public свойство CurScanDir:string, например
4. В стандартном методе Execute пишешь свой код по сканированию дерева каталогов и обязательно добавляешь присваивание свойству CurScanDir текущий сканируемый каталог, или файл, то, что нужно отображать.
5. В модуле главной формы вверху, где всякие uses Windows, Forms и т.п. добавляешь название своего модуля с потоком.
6. В Главной форме (TForm1, по умолчанию) в секции private описываешь что-то типа MyScanThread:TScanThread.
7. Добавляешь на форму таймер, устанавливаешь интервал примерно в 300-500, т.е. где-то 2-3 раза в секунду обновление - обычно нормально смотриться.
8. В обработчике таймера пишешь примерно так:
Код:
 if Assigned(MyScanThread)
then StatusBar1.Panels[0].Text:=MyScanThread.CurScanDir;
else StatusBar1.Panels[0].Text:='Сканирование не проводилось';
9. Теперь запуск потока и сканирования, например по нажатию на кнопку пишешь в обработчике нажатия кнопки что-нибудь типа:
Код:
 if Assigned(MyScanThread) then exit; //предотвращение повторного сканирования
MyScanThread:=TScanThread.Create(False);
Ну вот, примерно так.
 
B

Barmutik

#7
Для: Silver Wind

ЧТо в потоке то понятно .. только с таймером эт нехорошо .. или из потока синхронизировать доступ к ГУИ или из ГУИ надо обращаться со средствами синхронизации к переменным потока...
 
S

Silver Wind

#8
<!--QuoteBegin-Barmutik+4:10:2007, 12:08 -->
<span class="vbquote">(Barmutik @ 4:10:2007, 12:08 )</span><!--QuoteEBegin-->ЧТо в потоке то понятно .. только с таймером эт нехорошо .. или из потока синхронизировать доступ к ГУИ или из ГУИ надо обращаться со средствами синхронизации к переменным потока...
[snapback]80616" rel="nofollow" target="_blank[/snapback]​
[/quote]

С синхронизацией много моментов тонких (например, необходимо прикинуть насколько часто будет происходить синхронизация), все зависит от конкретной задачи - где-то, имхо, проще таймер использовать для обновления.

Сообщения от таймера имеют очень низкий приоритет, и если проц загружен, то они просто пропускаются.
Для такой простой операции как обновление информации о ходе процесса вполне подходит.

А так, вообще-то, да например, такие моменты, как завершение текущей задачи в потоке, или какие-то важные ее этапы однозначно лучше ловить эвентами, сообщениями, и т.п., а не полагаться на таймер.
Да и сам таймер стоит запускать/останавливать когда это необходимо, чтобы впустую не "жужжал".

Просто приведенный выше пример - максимально простое в реализации решение, полагаю автор может переспросить/уточнить, прочитать наконец, более тонкие моменты работы в потоков вообще и синхронизацию в частности.