Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Строка состояния
Форум программистов > Системное программирование > Delphi и Pascal > Delphi - FAQ
kaa
Есть цикл в котором перебираются каталоги,
хотелось бы чтоб на форме отражался каталог в
котором ведется поиск.
Подскажите!!!:)
vital
Для начала покажи как ты перебираешь каталоги. Есть тысячи версий и, соответственно, тысячи решений твоей траблы. Я думаю у тебя перебор каталогов обычными findfirst,findnext,findclose. Тогда я пробелмы не вижу. Ты ведь и так передаешь какой-то каталог функциям, значит он тебе известен.
Silver Wind
Вообще-то рекомендуется такие длительные операции как сканирование каталогов запихивать в отдельный поток, ну а отображение каталога, в котором сейчас идет поиск в основном потоке программы по таймеру.
kaa
Цитата(Silver Wind @ 1:10:2007, 01:30 )
Вообще-то рекомендуется такие длительные операции как сканирование каталогов запихивать в отдельный поток, ну а отображение каталога, в котором сейчас идет поиск в основном потоке программы по таймеру.
*


Немогли бы вы привести пример.
Заранее спасибо
Silver Wind
Стандартная демка по работе с потоками:
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);


Ну вот, примерно так.
kaa
Для: Silver Wind

Спасибо !
Barmutik
Для: Silver Wind

ЧТо в потоке то понятно .. только с таймером эт нехорошо .. или из потока синхронизировать доступ к ГУИ или из ГУИ надо обращаться со средствами синхронизации к переменным потока...
Silver Wind
Цитата(Barmutik @ 4:10:2007, 12:08 )
ЧТо в потоке то понятно .. только с таймером эт нехорошо .. или из потока синхронизировать доступ к ГУИ или из ГУИ надо обращаться со средствами синхронизации к переменным потока...
*


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

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

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

Просто приведенный выше пример - максимально простое в реализации решение, полагаю автор может переспросить/уточнить, прочитать наконец, более тонкие моменты работы в потоков вообще и синхронизацию в частности.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.