Нарушение доступа при итерации нескольких дисков

0

Я работаю в проекте, где мне нужно перебирать заданные диски, заданные в качестве ввода, чтобы перечислять файлы, присутствующие в нем. я реализовал его с потоками Windows и сохранил набор файлов в vector.It работает отлично, если я даю одиночный диск в качестве входного. но при попытке повторить несколько дисков он показывает "Необработанное исключение в 0x5efaad4a (msvcp100d.dll) в ListTest.exe: 0xC0000005: место обнаружения нарушения доступа 0xdddddde1". Я пытаюсь отлаживать программу, но ошибка появляется в случайных местах в моей программе. Я действительно не знаю, где именно ошибка в моей программе, так как она отлично работает для одного диска.

MultiDrive List.h

#include <string>
#include <iostream>
#include <Windows.h>
#include <vector>




namespace DriveFiles
{
    struct List
    {
         //std::string *scr ;
         std::vector<std::string>files[10];
    };  

    class FileList
    {
        //static const int MAX_THREADS = 3 ;
    public:
        //static vector<std::string>fil;
        //struct List *list;
        static void ListFiles(std::string DriveId);
        static DWORD WINAPI ParThread(LPVOID s);
        static DWORD WINAPI Listing(LPVOID s);
        //static void display(std::vector<std::string>&files);
    };
} 

MultiDriveListing.cpp

#include <iostream>
#include <Windows.h>
#include <fstream>
#include <sstream>
#include <vector>
#include <deque>
#include <sstream>
#include <string>
#include "MultiDrive List.h"

using namespace std;
CRITICAL_SECTION QueueLock;
CRITICAL_SECTION StoreLock;
//CRITICAL_SECTION FileLock;
#define MAX_THREADS 2
HANDLE Child[MAX_THREADS];
deque<string>directories;
//vector<string>files;
int Files = 0;
struct DriveFiles::List *list = new struct DriveFiles::List();

namespace DriveFiles
{

        void FileList :: ListFiles(string DriveId)
        {   
            DWORD threadid; 
            vector<string> v; 
            string buf; 


            stringstream ss(DriveId); 
            //InitializeCriticalSection(&FileLock);
            InitializeCriticalSection(&QueueLock);
            InitializeCriticalSection(&StoreLock);

            cout << " List Will be in file form in few Sec " << endl;

            directories.clear();
            list->files[0].clear();
             while (ss >> buf)
                v.push_back(buf);
            HANDLE *Parent = new HANDLE[v.size()];
            string *scr;
            scr = new string[v.size()];
            //list->scr = new string[v.size()];
            for(int i=0; i<v.size(); i++)
            {
                scr[i]= v[i];
            }
            //cout << "no of drives "<<v.size();
            //list = HeapAlloc(GetProcessHeap(),0,sizeof(List));
            long t1 = GetTickCount();
            for(int i=0;i<v.size();i++)
            {
                 Parent[i] = CreateThread(NULL,0,ParThread,(LPVOID)scr[i].c_str(),0,&threadid);
            }
            WaitForMultipleObjects(v.size(),Parent,TRUE,INFINITE);
            //display();
            cout<< "Execution Time " <<GetTickCount()-t1;
            v.clear();
            //return files;
        }


        DWORD WINAPI FileList :: ParThread(LPVOID s)
        {
            DWORD threadid;
            WIN32_FIND_DATAA ffd;
            //cout << "in parent" <<endl;
             //struct List *x;

            char *drive =(char*)s;
            string path = drive;
            cout<<drive;
            //vector<string>fil;
            //list->files[0] = fil;
            string spec = path + "\\" + "*";

            HANDLE hFind = FindFirstFileA(spec.c_str(), &ffd);

             if (INVALID_HANDLE_VALUE == hFind) 
             {
                     cout << "FindFirstFile error";
             }
                //cout<<"List of Folders in Drive"<<endl;
            do
            {
                 if(!strcmp(ffd.cFileName, "..") == 0 && !strcmp(ffd.cFileName, ".") == 0)
                {
                    if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
                    {   
                        EnterCriticalSection(&QueueLock);
                         directories.push_back( path + "\\" + ffd.cFileName );
                         LeaveCriticalSection(&QueueLock);
                         //cout << ffd.cFileName <<endl;
                    }
                    else
                    {
                        EnterCriticalSection(&StoreLock);
                        list->files[0].push_back( path + "\\" + ffd.cFileName );
                        Files++;
                        LeaveCriticalSection(&StoreLock);
                    }


                 }
            }while (FindNextFileA(hFind, &ffd) != 0);
            FindClose(hFind);
            /*fstream out;
            EnterCriticalSection(&FileLock);
            out.open("List.txt",ios_base::out | ios_base::app );
            vector<string>::iterator it = fil.begin();
            if(fil.size()!=0)
            do
            {
                //cout << "Writing to .txt File ";
                out<<*it<<endl;
                *it++;
            }while(it!=fil.end());
            out.close();
            fil.clear();
            LeaveCriticalSection(&FileLock);*/
            //DeleteCriticalSection(&QueueLock);
            //cout << endl<<list->files[0].size();
            cout << endl<<"No of Files "<<Files;
            for(int i=0;i<MAX_THREADS;i++)
            {
                 Child[i] = CreateThread(NULL,0,Listing,(LPVOID)&list->files[i],0,&threadid);
                 //cout<<endl<<list->files[i+1].size();
                 if( Child[i] == NULL )
                 {
                    printf("CreateThread error: %d\n", GetLastError());
                     return 0;
                 }
            }

             WaitForMultipleObjects(MAX_THREADS,Child,TRUE,INFINITE);
             return 0;
        }
        DWORD WINAPI FileList :: Listing(LPVOID s)
        {

            deque<string>subdir;

            string path = " ";
            string spec = " ";
            string subpath = " ";
            int Files = 0;
            //vector<string>files;
            vector<string>*file;

            file = (vector<string>*)s;
            WIN32_FIND_DATAA ffd;
            //InitializeCriticalSection(&QueueLock);


            while(true)     
            {
                        EnterCriticalSection(&QueueLock);
                        if(directories.empty())
                        {
                            LeaveCriticalSection(&QueueLock);
                            //Sleep(500);
                            break;
                    }
                        else
                        {
                            path = directories.front();
                            directories.pop_front();
                            spec = path + "\\" + "*";
                            LeaveCriticalSection(&QueueLock);
                            subdir.push_front(path);
                        }
                        while(!subdir.empty())
                        {
                            subpath = subdir.front();
                            spec = subpath + "\\" + "*";
                            subdir.pop_front();

                            HANDLE hfind = FindFirstFileA(spec.c_str(),&ffd);
                            if(hfind == INVALID_HANDLE_VALUE)
                                    continue;
                            cout << subpath << endl;
                            do
                            {
                                if(strcmp(ffd.cFileName,".") && strcmp(ffd.cFileName,".."))
                                {
                                    if(ffd.dwFileAttributes &FILE_ATTRIBUTE_DIRECTORY)
                                    {
                                        //EnterCriticalSection(&QueueLock);
                                        subdir.push_front(subpath + "\\" + ffd.cFileName);
                                        //LeaveCriticalSection(&QueueLock);
                                    }
                                    else
                                    {   
                                        //EnterCriticalSection(&StoreLock);
                                        file->push_back(subpath + "\\" + ffd.cFileName);
                                        Files++;
                                        //LeaveCriticalSection(&StoreLock);
                                    }
                            }
                        }while(FindNextFileA(hfind,&ffd));
                        FindClose(hfind);
                        hfind = INVALID_HANDLE_VALUE;
                    }
            }
            //subdir.clear();
            //directories.clear();
            //cout <<endl<<file->size();
            cout<<" No of Files  "<<Files <<endl ;
            //display(files);
            //subdir.clear();
            //HeapFree(GetProcessHeap(), 0, list);
            return 0;
        }
}

TestList.cpp

#include <iostream>
#include <string>
#include <fstream>
#include "MultiDrive List.h"

using namespace std;
using namespace DriveFiles;

int main()
{
    string drv;

    //vector<string>files;
    ofstream out;
    //List *list;

    cout << "\n Enter the Id of Drives to list " <<endl;

    getline(cin,drv);

    FileList :: ListFiles(drv);

    extern struct DriveFiles::List *list;

    /*for(int i=0;i<3;i++)
        cout <<endl<< list->files[i].size();*/

    //cout<<"Listed";

    for(int i=0;i<3;i++)
    {

        //while(k< list->files[i].size())
        //{
        //cout <<endl<< list->files[i].size();
            out.open("Lists.txt",ios_base::out | ios_base::app );
            vector<string>::iterator it = list->files[i].begin();
            if(list->files[i].size()!=0)
            do
            {
                //cout << "Writing to .txt File ";
                out<<*it<<endl;
                *it++;
                //k++;
            }while(it!=list->files[i].end());
            out.close();
        //}
        //list->files[i].clear();
    }
    system("pause");
    return 0;
}

Мой код до тех пор, пока MultiDrive List.h и MultiDriveListing.cpp из статической библиотеки.lib. TestList.cpp - это программа, которая обращается к библиотеке, чтобы получить результат и печатает ее. Пожалуйста, обратите внимание на любые улучшения и помощь.

  • 0
    Было бы легко с моей стороны предложить вам отладку? Ты знаешь как? Я считаю, что ваша настоящая проблема в том, что вы еще не научились это делать. Будет легче добиться прогресса в будущем, если вы научитесь отлаживать.
  • 0
    Я также хотел бы отметить, что ваш код протекает довольно плохо. Попробуйте отучить себя от новых и использовать стандартные контейнеры. Я не хочу копать глубже, потому что здесь так много кода. Вы не можете сократить это? Это тоже поможет вашей отладке.
Показать ещё 1 комментарий
Теги:
multithreading
vector
winapi

2 ответа

0

Я подозреваю, что его использование

(char*)s


через несколько потоков.

0

Хотя с вашим кодом существует несколько проблем (утечки являются одним из них), быстрый взгляд заставляет меня подозревать, что ваш итератор увеличивается в этом блоке кода. Попробуйте следующее изменение:

do
{
    out<<*it<<endl;
    ++it;          // <----- this line changed
}while(it!=list->files[i].end());
  • 0
    ... Спасибо за указывая. Но на самом деле ошибка происходит во время выполнения MultiDriveListing.cpp. Я не знаю, где именно ошибка происходит.
  • 0
    Спасибо .. Но, пожалуйста, помогите мне изменить другие проблемы, так как я не знаю точно, где произошла ошибка.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню