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

Тема в разделе "Delphi - FAQ", создана пользователем kaa, 29 сен 2007.

  1. kaa

    kaa Гость

    Есть цикл в котором перебираются каталоги,
    хотелось бы чтоб на форме отражался каталог в
    котором ведется поиск.
    Подскажите!!!:p
     
  2. vital

    vital Больной Компом Детектед
    Команда форума Web Team

    Регистрация:
    29 янв 2006
    Сообщения:
    2.470
    Симпатии:
    27
    Для начала покажи как ты перебираешь каталоги. Есть тысячи версий и, соответственно, тысячи решений твоей траблы. Я думаю у тебя перебор каталогов обычными findfirst,findnext,findclose. Тогда я пробелмы не вижу. Ты ведь и так передаешь какой-то каталог функциям, значит он тебе известен.
     
  3. Silver Wind

    Silver Wind Гость

    Вообще-то рекомендуется такие длительные операции как сканирование каталогов запихивать в отдельный поток, ну а отображение каталога, в котором сейчас идет поиск в основном потоке программы по таймеру.
     
  4. kaa

    kaa Гость

    <!--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]

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

    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. В обработчике таймера пишешь примерно так:
    Код (Text):
     if Assigned(MyScanThread)
    then StatusBar1.Panels[0].Text:=MyScanThread.CurScanDir;
    else StatusBar1.Panels[0].Text:='Сканирование не проводилось';
    9. Теперь запуск потока и сканирования, например по нажатию на кнопку пишешь в обработчике нажатия кнопки что-нибудь типа:
    Код (Text):
     if Assigned(MyScanThread) then exit; //предотвращение повторного сканирования
    MyScanThread:=TScanThread.Create(False);
    Ну вот, примерно так.
     
  6. kaa

    kaa Гость

    Для: Silver Wind

    Спасибо !
     
  7. Barmutik

    Barmutik Гость

    Для: Silver Wind

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

    Silver Wind Гость

    <!--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]

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

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

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

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

Поделиться этой страницей