Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ReadDirectoryChangesW 
:(
    Опции темы
nerig
Дата 29.4.2011, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 26.4.2010

Репутация: нет
Всего: нет



Слежу за изменениями файлов в папке. Есть вот такой код:
Код

AnsiString dir = Form2->Edit1->Text;
HANDLE hdir = CreateFile(dir.c_str(),
              FILE_LIST_DIRECTORY,
              FILE_SHARE_READ|FILE_SHARE_WRITE,
              NULL,
              OPEN_EXISTING,
              FILE_FLAG_BACKUP_SEMANTICS/*|FILE_FLAG_OVERLAPPED*/,
              NULL);
FILE_NOTIFY_INFORMATION Buffer[1024];
DWORD BytesReturned;

while ( true)
{
int ret = ReadDirectoryChangesW(
        hdir,
        &Buffer,
        sizeof(Buffer),
        True,
        FILE_NOTIFY_CHANGE_SECURITY|
        FILE_NOTIFY_CHANGE_SIZE|
        FILE_NOTIFY_CHANGE_ATTRIBUTES|
        FILE_NOTIFY_CHANGE_DIR_NAME|
        FILE_NOTIFY_CHANGE_FILE_NAME,
        &BytesReturned,
        NULL,
        NULL
        );

 name = Buffer[0].FileName;
switch(Buffer[0].Action)
  {
   case FILE_ACTION_ADDED:
    Memo1->Lines->Add("Файл добавлен"+ name);
    break;
   case FILE_ACTION_REMOVED:
    Memo1->Lines->Add("Файл удален"+ name);
    break;
   case FILE_ACTION_MODIFIED:
    Memo1->Lines->Add("Файл изменен"+ name);
    break;
  }
  break;
}
 CloseHandle(hdir);
 delete [] Buffer;

Проблема в том, что работает он синхронно, в результате чего программа зависает и ждет изменений в папке, и только после них прога отвисает. Хотелось бы сделать ассинхронно, но что то не заладилось.  Либо как можно прервать выполнение данной процедуры через некоторое время по таймеру, если никаких действий не происходит. 
И еще один вопрос: иногда к имени файла дописывается лишние символы, как исправить?
Помогите, пожалуйста.
PM MAIL   Вверх
borisbn
Дата 29.4.2011, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 18
Всего: 135



Цитата(nerig @  29.4.2011,  08:33 Найти цитируемый пост)
Хотелось бы сделать ассинхронно

какая проблема ? переносишь весь код в поток (TThread) и всё. Только не забудь, что доступ к VCL-компонентам из потока можно осуществлять только через Synchronize.
Код

class MyThread : public TThread {
...
    AnsiString stringToAdd;
    void addString();
};

void MyThread::Execute() {
  while ( !Terminated ) {
      ReadDirectoryChangesW ...
      ...
      switch(Buffer[0].Action)
      {
           case FILE_ACTION_ADDED:
               //Memo1->Lines->Add("Файл добавлен"+ name);
               stringToAdd = "Файл добавлен"+ name;
               Synchronize( addString );
           break;
           ...
      }
  }
}

void MyThread::addString() {
    Form1->Memo1->Lines->Add( stringToAdd );
}





--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
nerig
Дата 29.4.2011, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 26.4.2010

Репутация: нет
Всего: нет



borisbn
при компиляции возникает ошибка "'MyThread::Execute()' is not the member of 'MyThread'"
PM MAIL   Вверх
borisbn
Дата 29.4.2011, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 18
Всего: 135



nerig, ээээээээ, так низя. я ж тебе просто показал, как это делается. ты смотрел документацию по TThread ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
nerig
Дата 29.4.2011, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 26.4.2010

Репутация: нет
Всего: нет



borisbn
упс, дурак, думал что это уже код, извиняюсь, пошел смотреть документацию
PM MAIL   Вверх
nerig
Дата 29.4.2011, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 26.4.2010

Репутация: нет
Всего: нет



так, вроде с потоками разобрался,
Код

class MyThread : public TThread
{
    AnsiString stringToAdd;
    void __fastcall addString();
public:
virtual  void __fastcall Execute(void);
};

void __fastcall MyThread::Execute() {
  while ( !Terminated ) {
  ...
  ReadDirectoryChangesW(
  ...      
  switch(Buffer[0].Action)
      {
           case FILE_ACTION_ADDED:
               stringToAdd = "Файл добавлен"+ name;
               Synchronize( addString );
           break;

      }
 }
}


void __fastcall MyThread::addString() {
    Form1->Memo1->Lines->Add( stringToAdd );
}

 а как сделать чтобы по кнопке они запускались не разберусь
PM MAIL   Вверх
borisbn
Дата 29.4.2011, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 18
Всего: 135



Под рукой нет документации, но в TThread есть что-то типа Start
Не забудь, что в конмтрукторе формы нужно создать (new) объект типа MyThread, а в деструкторе остановить поток (thread->Terminate(); thread->WaitFor();) и удалить объект (delete)


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
nerig
Дата 30.4.2011, 05:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 26.4.2010

Репутация: нет
Всего: нет



Разобрался со всем, только почему то в memo не пишется имя добавленного файла, а только что файл добавлен.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0484 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.