2014-01-25 7 views
0

Я сделал программу, использующую многопоточность, чтобы перечислить файлы в каталоге/диске. При выполнении этого получается меньшее количество файлов, чем фактическое отсутствие файлов внутри каталога/drive.i, не знаю, где ошибка. помогите мне и правильно руководствуйтесь логикой.MultiThreading с каталогами

СПРАВОЧНИК (глобальная Deque) состоит из списка папок в каталоге/Drive

DWORD WINAPI List(LPVOID) 
    { 
     deque<string>subdir; 
     while(true) 
     { 
      EnterCriticalSection(&QueueLock); 
      if(directories.empty()) 
      { 
       LeaveCriticalSection(&QueueLock); 
       //Sleep(500); 
       break; 
      } 
      else 
      { 
       string path = directories.front(); 
       //cout << path << endl; 
       //spec = path + "\\" + "*"; 
       directories.pop_front(); 
       subdir.push_front(path); 
       LeaveCriticalSection(&QueueLock); 

      } 

      //Listcontents(path,spec,subdir); 
      while(!subdir.empty()) 
      { 
       EnterCriticalSection(&Fillock); 
       string subpath = subdir.front(); 
       string spec = subpath + "\\" + "*"; 
       subdir.pop_front(); 
       LeaveCriticalSection(&Fillock); 
       HANDLE hf = FindFirstFileA(spec.c_str(),&ffd); 
       if(hf == INVALID_HANDLE_VALUE) 
        continue; 

      do 
      { 
       if(strcmp(ffd.cFileName,".") && strcmp(ffd.cFileName,"..")) 
       { 
        if(ffd.dwFileAttributes &FILE_ATTRIBUTE_DIRECTORY) 
        { 
         EnterCriticalSection(&Sublock); 
         cout<< subpath <<endl; 
         subdir.push_front(subpath + "\\" + ffd.cFileName); 
         LeaveCriticalSection(&Sublock); 
        } 
        else 
        { 
         EnterCriticalSection(&Veclock); 
         files.push_back(subpath + "\\" + ffd.cFileName); 
         Files++; 
         LeaveCriticalSection(&Veclock); 
        } 
       } 

      }while(FindNextFileA(hf,&ffd)); 
      FindClose(hf); 
      hf = INVALID_HANDLE_VALUE; 
     } 
     } 
     return 0; 
    } 
+0

Использование более чем одной темы, безусловно, является наихудшей ошибкой, которую вы совершили. Нитки покупают вам больше циклов процессора, они не покупают вам больше дисковых накопителей. Они на самом деле крайне вредны для перфоратора, отправляя головку дисковода на молнию назад и вперед. Безусловно, самое дорогое, что вы можете сделать с диском. Просто используйте ** одну ** нить, что, конечно, также решает проблему с чередованием. –

+0

@HansPassant Но мне нужно перечислить файлы более быстрым образом, как это может быть достигнуто ... Я думаю, что только многопоточность - это решение .. Есть ли какие-либо другие методы? – Baalki

+0

Сканирование всего жесткого диска происходит медленно, независимо от того, как вы его нарезаете. Вам нужно думать нестандартно, например, сканировать только один уровень за раз или использовать чужую базу данных, такую ​​как индекс. –

ответ

0

@Adrian я должен поблагодарить у код lot.This я реализован пробеги perfectly.i исправленных свою ошибку и теперь его прекрасные.

DWORD WINAPI List(LPVOID) 
    { 
     int localFileCount = 0; 
     deque<string>subdir; 
     WIN32_FIND_DATAA ffdT; 
     string path,spec; 
     while(true) 
     { 
      EnterCriticalSection(&QueueLock); 
      if(directories.empty()) 
      { 
       LeaveCriticalSection(&QueueLock); 
       break; 
      } 
      else 
      { 
       path = directories.front(); 
       directories.pop_front(); 
       LeaveCriticalSection(&QueueLock); 


       //cout << path << endl; 
       //spec = path + "\\" + "*"; 
      } 





       string subpath = path; 
       spec = subpath + "\\" + "*"; 


       HANDLE hf = FindFirstFileA(spec.c_str(),&ffdT); 
       if(hf == INVALID_HANDLE_VALUE) 
        continue; 

      do 
      { 

       if(strcmp(ffdT.cFileName,".") && strcmp(ffdT.cFileName,"..")) 
       { 

        if(ffdT.dwFileAttributes &FILE_ATTRIBUTE_DIRECTORY) 
        { 
         EnterCriticalSection(&QueueLock); 
         directories.push_front(subpath + "\\" + ffdT.cFileName); 
         LeaveCriticalSection(&QueueLock); 
        } 
        else 
        { 
         EnterCriticalSection(&FileEntryLock); 
         files.push_back(subpath + "\\" + ffdT.cFileName); 
         Files++; 
         localFileCount++; 
         LeaveCriticalSection(&FileEntryLock); 
        } 
       } 
      }while(FindNextFileA(hf,&ffdT)!=0); 
      FindClose(hf); 
      hf = INVALID_HANDLE_VALUE; 


      //cout<< " No of File : "<<localFileCount<<endl; 
      localFileCount = 0; 
     } 

     return 0; 
    } 
Смежные вопросы