Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > С/С++
Перезагрузить страницу Поиск файлов в потоках
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
eu6pc eu6pc вне форума
Member
 
Сообщений: 26
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.03.2011
По умолчанию Поиск файлов в потоках - 13.04.2011, 12:11

Добрый день!

Коллеги, помогите советом: 2 дня бьюсь, не могу найти ошибку...
Хочу сделать поиск файлов по содержимому в каталоге (с вложенными подкаталогами). Каждый поток ищет в 2-х каталогах.
Программу сделал, на маленьких каталогах работает как часы. А вот если укажу большую папку типа Install - вылетает с ошибкой - инструкция ля ляля обратилась к памяти по адресу ляляля память не может быть read, притом такое чувство что каждый раз в разном месте...
подскажите, пожалуйста, где я дурак ?
Чувствую что ошибка в самой функции потока.
При запуске программа сначала ищет все подкаталоги и сохраняет их в динамическом массиве, а потом запускаются потоки и каждый поток ищет файлы в двух каталогах.

Вот код: (VISUAL C++ 6, пишу на нем впервые)
cpp Код:
int main(int argc, char* argv[])
{
    int i;

    pthread_attr_t attrs;
    pthread_mutex_init(&mutex,NULL);

    //инициализация атрибутов потока
       if(0!=pthread_attr_init(&attrs))
       {
        perror("Cannot initialize attributes");
        abort();
       };

    //установка атрибута "присоединенный"
    if(0!=pthread_attr_setdetachstate(&attrs, PTHREAD_CREATE_JOINABLE))
    {
        perror("Error in setting attributes");
        abort();
    }
//---------------

//----- начали поиск каталогов -----------------------------------------
    strcpy(text,"fox");
    strcpy(put,"c:\\letters\\");

   
    dir=(mystr*)realloc(dir,sizeof(mystr)*(ind+1));
    strcpy(dir[ind].s,put);
    ind++;

    strcat(put,"*.*");

    SearchFolders(put,TRUE);
    // после вызова в массиве dir - каталоги, в переменной Ind - колво каталогов

    k_thrs=(ind/2)+(ind%2);
        pthread_t *thrs=new pthread_t[k_thrs];         // создаем массив потоков
    int *ids = new int[k_thrs];                    // создаем массив id потоков
    for (i=0;i<k_thrs;i++)
        ids[i]=i;                                // инициализируем его 0,1,2,...

    //порождение  потоков
    for( i = 0; i<k_thrs; i++)
        if(0!=pthread_create(&thrs[i], &attrs, prod, &ids[i]))
        {
            perror("Cannot create a thread");
            abort();
        }


    //освобождение ресурсов, занимаемых описателем атрибутов
    pthread_attr_destroy(&attrs);

    int k;
    //ожидание завершения порожденных потоков
    for( i = 0; i<k_thrs; i++)
        k=pthread_join(thrs[i], NULL);
       

    puts("result:");
    for(i=0;i<r_ind;i++)
        puts(res[i].s);

    delete [] thrs;
    delete [] ids;
    if (dir!=NULL)
    {
       free (dir);
       dir=NULL;
    }
    if (res!=NULL)
    {
       free (res);
       res=NULL;
    }

    puts("end!");

    return 0;
}

void* prod(void* me); // - вот функция потока

//typedef void (*LPSEARCHFUNC)(LPCTSTR lpszFileName);

struct mystr  // struct for dynamic array
{
    char s[255];
};

mystr *dir=NULL; // массив для хранения каталогов
mystr *res=NULL; // для хранения найденных файлов

//char dir[900][250];
//char res[900][250];
int ind=0;
int r_ind=0;
char text[20]; // искомый текст
char put[50]; // для ввода пути поиска

int k_thrs=0;

//int ids[4] = {0,1,2,3};
//четрыре объекта типа "описатель потока"
//pthread_t thrs[4];
//мьютекс
pthread_mutex_t mutex;

//функция потока
void* prod(void* me)
{
    // начинаем поиск файлов в 2- каталогах согласно индексу потока
     LPTSTR part;
    char tmp[MAX_PATH]; // временный массив
    char name[MAX_PATH];
    char drive[5],path[250],fname[250],ext[7]; // для разделения пути;
    char lpszFileName[250];
    char fpath[250];
    HANDLE hSearch = NULL;
    WIN32_FIND_DATA wfd;
    FILE *f=NULL;
    //char buf[20];
    int pr=0;

    char *buf = new char[20];    
   
    //узнали номер потока
    int offset = *((int*)me);

   


    memset(&wfd, 0, sizeof(WIN32_FIND_DATA));



    for (int z=offset*2;(z<=offset*2+1)&&(z<ind);z++)
    {
    printf("potok N%d dir %s\n",offset,dir[z].s);
   
    strcpy(lpszFileName,dir[z].s);
    strcat(lpszFileName,"*.*");

        GetFullPathName(lpszFileName, MAX_PATH, tmp, &part);
   
        strcpy(name, part);
        strcpy(part, "*.*");


        // если папки существуют, то делаем поиск
        wfd.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
        if (!((hSearch = FindFirstFile(tmp, &wfd)) == INVALID_HANDLE_VALUE))
        do
        {
            // в каждой папке есть две папки с именами "." и ".."
            // и эти папки мы не трогаем
            if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
            continue;
             
           
            _splitpath(lpszFileName,drive,path,fname,ext);
            strcpy(fpath,drive);
            strcat(fpath,path);
            strcat(fpath,wfd.cFileName);

               
            // обратотка файла -----------
            pr=0;
        //    puts(fpath);

            f=NULL;
            f = fopen(fpath,"rb");


            if (f!=NULL)
            {
               
            do
            {
                if (!feof(f)&&!ferror(f)) fread(&buf[0],sizeof(char),1,f);
                if (buf[0]==text[0])
                {
                    int j=1,t=0;

                    while ((j<strlen(text))&&(!feof(f)&&(t==0)))
                    {
                        fread(&buf[j],sizeof(char),1,f);
                        if (buf[j]!=text[j]) t=1;
                        j++;

                    }
                    if (t==0) pr=1;

                }

   
            }
            while (!feof(f)&&(!ferror(f))&&(pr==0));

            fclose(f);

            // если pr=1 - значит файл содержит текст, добавляем его в массив

            if (pr==1)
            {
               
                pthread_mutex_lock(&mutex);

                res=(mystr*)realloc(res,sizeof(mystr)*(r_ind+1));
               
                strcpy(res[r_ind].s,fpath);
                r_ind++;
   
                //освобождение мьютекса
                pthread_mutex_unlock(&mutex);
            }    



            }



            // конец обработки файла -----
           
        }
        while (FindNextFile(hSearch, &wfd)); // ищем следующий файл

        FindClose (hSearch); // заканчиваем поиск

    } // конец цикла по двум папкам




//--------------------------------------------------------
//    pthread_exit(NULL); ?? нужно ли это
    delete [] buf;
    return NULL;
   
}
// эта функция поиска каталогов
bool SearchFolders(LPCTSTR lpszFileName, bool bInnerFolders = TRUE)
{
    LPTSTR part;
    char tmp[MAX_PATH]; // временный массив
    char name[MAX_PATH];

    HANDLE hSearch = NULL;
    WIN32_FIND_DATA wfd;
    memset(&wfd, 0, sizeof(WIN32_FIND_DATA));

//    puts(lpszFileName);
    // сначало поиск внутри вложенных папках ...
    if(bInnerFolders)
    {
        if(GetFullPathName(lpszFileName, MAX_PATH, tmp, &part) == 0) return FALSE;
        strcpy(name, part);
        strcpy(part, "*.*");


        // если папки существуют, то делаем поиск
        wfd.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
        if (!((hSearch = FindFirstFile(tmp, &wfd)) == INVALID_HANDLE_VALUE))
        do
        {
            // в каждой папке есть две папки с именами "." и ".."
            // и эти папки мы не трогаем

            // пропускаем папки "." и ".."
            if (!strncmp(wfd.cFileName, ".", 1) || !strncmp(wfd.cFileName, "..", 2))            
            continue;
       
            if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) // если мы нашли папку
            {
                char next[MAX_PATH];
                if(GetFullPathName(lpszFileName, MAX_PATH, next, &part) == 0) return FALSE;
                strcpy(part, wfd.cFileName);
           
            //    strcpy(dir[ind],next);
        //        strcat(dir[ind],"\\");
        //        strcat(dir[ind],"\\");

                strcat(next, "\\");

                dir=(mystr*)realloc(dir,sizeof(mystr)*(ind+1));
                strcpy(dir[ind].s,next);
                ind++;
        //        puts(next);
                strcat(next, name);


                SearchFolders(next, TRUE);
            }
        }
        while (FindNextFile(hSearch, &wfd)); // ищем следующий файл

        FindClose (hSearch); // заканчиваем поиск
    }

    if ((hSearch = FindFirstFile(lpszFileName, &wfd)) == INVALID_HANDLE_VALUE)
        return TRUE;

    FindClose (hSearch); // заканчиваем поиск

    return TRUE;
}
Ответить с цитированием
  (#2 (permalink)) Старый
Влад Влад вне форума
Специалист
 
Сообщений: 3,884
Сказал(а) спасибо: 1
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 27.06.2002
Адрес: Санкт-Петербург
По умолчанию 13.04.2011, 13:37

Гмм.... Слава, а оно вообще в Visual C++ 6 компилируется?


The difference between theory and practice is that in theory, there is no difference between theory and practice, but in practice, there is.
Ответить с цитированием
  (#3 (permalink)) Старый
eu6pc eu6pc вне форума
Member
 
Сообщений: 26
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.03.2011
По умолчанию 13.04.2011, 13:40

Компилируется, и отлично работает на маленьких каталогах.
Я просто привел часть кода, не весь.
Ответить с цитированием
  (#4 (permalink)) Старый
Влад Влад вне форума
Специалист
 
Сообщений: 3,884
Сказал(а) спасибо: 1
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 27.06.2002
Адрес: Санкт-Петербург
По умолчанию 13.04.2011, 13:55

Ну так выложи минимальный компилябельный код, а мы посмотрим.... Додумывать и дописывать отсутствующие части кода - дело довольно мутное. Ошибка может оказаться и там, а проявляться - здесь.


The difference between theory and practice is that in theory, there is no difference between theory and practice, but in practice, there is.
Ответить с цитированием
  (#5 (permalink)) Старый
eu6pc eu6pc вне форума
Member
 
Сообщений: 26
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.03.2011
По умолчанию 13.04.2011, 14:02

Хорошо. Вот полностью код. Смысл в чем -сначала выполнить поиск последовательно, без потоков - это работает (я закомментировал), а потом сделать поиск в потоках.
На небольних папках - все работает отлично. На больших - последовательный поиск работает, в потоках - выдает вышеуказанную ошибку, притом иногда может просто как бы зависнуть, иногда вывалится с ошибкой... непонятно.
#include <winapi.h>
#include <windows.h>
#include <stdio.h>
#include "stdafx.h"
#include <atlbase.h>
#include <iostream>
#include <pthread.h>

void conv(char *s);
bool SearchFiles(LPCTSTR lpszFileName,bool bInnerFolders);
bool SearchFolders(LPCTSTR lpszFileName,bool bInnerFolders);
void* prod(void* me);

struct mystr // struct for dynamic array
{
char s[255];
};
mystr *dir=NULL; // массив для хранения каталогов
mystr *res=NULL; // для хранения найденных файлов
int ind=0;
int r_ind=0;
char text[20]; // искомый текст
char put[50]; // для ввода пути поиска

int k_thrs=0;

//мьютекс
pthread_mutex_t mutex;

//функция потока
void* prod(void* me)

{ // начинаем поиск файлов в 2- каталогах согласно индексу потока
LPTSTR part;
char tmp[MAX_PATH]; // временный массив
char name[MAX_PATH];
char drive[5],path[250],fname[250],ext[7]; // для разделения пути;
char lpszFileName[250];
char fpath[250];
HANDLE hSearch = NULL;
WIN32_FIND_DATA wfd;
FILE *f=NULL;
//char buf[20];
int pr=0;
char *buf = new char[20];
int offset = *((int*)me);

memset(&wfd, 0, sizeof(WIN32_FIND_DATA));

for (int z=offset*2;(z<=offset*2+1)&&(z<ind);z++)
{
printf("potok N%d dir %s\n",offset,dir[z].s);

strcpy(lpszFileName,dir[z].s);
strcat(lpszFileName,"*.*");

GetFullPathName(lpszFileName, MAX_PATH, tmp, &part);

strcpy(name, part);
strcpy(part, "*.*");

// если папки существуют, то делаем поиск
wfd.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
if (!((hSearch = FindFirstFile(tmp, &wfd)) == INVALID_HANDLE_VALUE))
do
{
if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
continue;
_splitpath(lpszFileName,drive,path,fname,ext);
strcpy(fpath,drive);
strcat(fpath,path);
strcat(fpath,wfd.cFileName);

// обратотка файла -----------
pr=0;
f=NULL;
f = fopen(fpath,"rb");
if (f!=NULL)
{
do
{
if (!feof(f)&&!ferror(f)) fread(&buf[0],sizeof(char),1,f);
if (buf[0]==text[0])
{
int j=1,t=0;

while ((j<strlen(text))&&(!feof(f)&&(!ferror(f))&&(t==0) ))
{
fread(&buf[j],sizeof(char),1,f);
if (buf[j]!=text[j]) t=1;
j++;

}
if (t==0) pr=1;

}
}
while (!feof(f)&&(!ferror(f))&&(pr==0));
fclose(f);

// если pr=1 - значит файл содержит текст, добавляем его в массив
if (pr==1)
{
pthread_mutex_lock(&mutex);
res=(mystr*)realloc(res,sizeof(mystr)*(r_ind+1));
strcpy(res[r_ind].s,fpath);
r_ind++;
//освобождение мьютекса
pthread_mutex_unlock(&mutex);
}

}
// конец обработки файла -----

}

while (FindNextFile(hSearch, &wfd)); // ищем следующий файл
FindClose (hSearch); // заканчиваем поиск
} // конец цикла по двум папкам

delete [] buf;
return NULL;

}
void conv(char *s)
{
int i,j;
for (i=0;i<strlen(s);i++)
if (s[i]=='\\')
{
for(j=strlen(s);j>=i;j--)
s[j+1]=s[j];

s[i+1]='\\';
i++;

}

}

int main(int argc, char* argv[])
{
int i;

pthread_attr_t attrs;
pthread_mutex_init(&mutex,NULL);

//инициализация атрибутов потока
if(0!=pthread_attr_init(&attrs))
{
perror("Cannot initialize attributes");
abort();
};

//установка атрибута "присоединенный"
if(0!=pthread_attr_setdetachstate(&attrs, PTHREAD_CREATE_JOINABLE))
{
perror("Error in setting attributes");
abort();
}
//---------------

//----- начали поиск каталогов -----------------------------------------
// std::cout<<"Enter text: ";
// std::cin>>text;
// std::cout<<"Enter path: ";
// std::cin>>put;
strcpy(text,"fox");
strcpy(put,"c:\\letters\\");


dir=(mystr*)realloc(dir,sizeof(mystr)*(ind+1));
strcpy(dir[ind].s,put);
ind++;

strcat(put,"*.*");


puts("posledovatelno:");
// SearchFiles(put,TRUE);
puts("end.");
puts("parralelno:");

SearchFolders(put,TRUE);
// после вызова в массиве dir - каталоги, в переменной Ind - колво каталогов
/* puts("dir output");
for(i=0;i<ind;i++)
puts(dir[i].s);


char ttt[10];
std::cin>>ttt;
// for(i=0;i<ind;i++)
// conv(dir[i]);
*/

k_thrs=(ind/2)+(ind%2);
printf("%d %d\n",ind,k_thrs);
pthread_t *thrs=new pthread_t[k_thrs]; // создаем массив потоков
int *ids = new int[k_thrs]; // создаем массив id потоков
for (i=0;i<k_thrs;i++)
ids[i]=i; // инициализируем его 0,1,2,...

//порождение потоков
for( i = 0; i<k_thrs; i++)
if(0!=pthread_create(&thrs[i], &attrs, prod, &ids[i]))
{
perror("Cannot create a thread");
abort();
}


//освобождение ресурсов, занимаемых описателем атрибутов
pthread_attr_destroy(&attrs);

int k;
//ожидание завершения порожденных потоков
for( i = 0; i<k_thrs; i++)
k=pthread_join(thrs[i], NULL);


puts("result:");
for(i=0;i<r_ind;i++)
puts(res[i].s);

delete [] thrs;
delete [] ids;
if (dir!=NULL)
{
free (dir);
dir=NULL;
}
if (res!=NULL)
{
free (res);
res=NULL;
}

puts("end!");

return 0;
}


bool SearchFiles(LPCTSTR lpszFileName, bool bInnerFolders = TRUE)
{
FILE *f=NULL;
LPTSTR part;
char tmp[MAX_PATH]; // временный массив
char name[MAX_PATH];

HANDLE hSearch = NULL;
WIN32_FIND_DATA wfd;
memset(&wfd, 0, sizeof(WIN32_FIND_DATA));

// puts(lpszFileName);
// сначало поиск внутри вложенных папках ...
if(bInnerFolders)
{
if(GetFullPathName(lpszFileName, MAX_PATH, tmp, &part) == 0) return FALSE;
strcpy(name, part);
strcpy(part, "*.*");


// если папки существуют, то делаем поиск
wfd.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
if (!((hSearch = FindFirstFile(tmp, &wfd)) == INVALID_HANDLE_VALUE))
do
{
// в каждой папке есть две папки с именами "." и ".."
// и эти папки мы не трогаем

// пропускаем папки "." и ".."
if (!strncmp(wfd.cFileName, ".", 1) || !strncmp(wfd.cFileName, "..", 2))
continue;

if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) // если мы нашли папку
{
char next[MAX_PATH];
if(GetFullPathName(lpszFileName, MAX_PATH, next, &part) == 0) return FALSE;
strcpy(part, wfd.cFileName);
strcat(next, "\\");
strcat(next, name);

SearchFiles(next, TRUE);
}
}
while (FindNextFile(hSearch, &wfd)); // ищем следующий файл

FindClose (hSearch); // заканчиваем поиск
}

if ((hSearch = FindFirstFile(lpszFileName, &wfd)) == INVALID_HANDLE_VALUE)
return TRUE; // в противном случае выходим
do
if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) // если мы нашли файл
{
char file[MAX_PATH];
if(GetFullPathName(lpszFileName, MAX_PATH, file, &part) == 0) return FALSE;
strcpy(part, wfd.cFileName);
//------- обработка файла---

f = fopen(file,"rb");

if (f!=NULL)
{


char buf[20];
int pr=0;


do
{
fread(&buf[0],sizeof(char),1,f);
if (buf[0]==text[0])
{
int j=1,t=0;

while ((j<strlen(text))&&(!feof(f)&&(t==0)))
{
fread(&buf[j],sizeof(char),1,f);
if (buf[j]!=text[j]) t=1;
j++;

}
if (t==0) pr=1;

}


}
while (!feof(f)&&(pr==0));

fclose(f);

if (pr==1)
puts(file);



}// конец IF F!=NULL - если файл открыть не удалось


// puts(file);
// lpSearchFunc(file);
//--------------------------
}
while (FindNextFile(hSearch, &wfd)); // ищем следующий файл
FindClose (hSearch); // заканчиваем поиск

return TRUE;
}

bool SearchFolders(LPCTSTR lpszFileName, bool bInnerFolders = TRUE)
{
LPTSTR part;
char tmp[MAX_PATH]; // временный массив
char name[MAX_PATH];

HANDLE hSearch = NULL;
WIN32_FIND_DATA wfd;
memset(&wfd, 0, sizeof(WIN32_FIND_DATA));

// puts(lpszFileName);
// сначало поиск внутри вложенных папках ...
if(bInnerFolders)
{
if(GetFullPathName(lpszFileName, MAX_PATH, tmp, &part) == 0) return FALSE;
strcpy(name, part);
strcpy(part, "*.*");


// если папки существуют, то делаем поиск
wfd.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
if (!((hSearch = FindFirstFile(tmp, &wfd)) == INVALID_HANDLE_VALUE))
do
{
// в каждой папке есть две папки с именами "." и ".."
// и эти папки мы не трогаем

// пропускаем папки "." и ".."
if (!strncmp(wfd.cFileName, ".", 1) || !strncmp(wfd.cFileName, "..", 2))
continue;

if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) // если мы нашли папку
{
char next[MAX_PATH];
if(GetFullPathName(lpszFileName, MAX_PATH, next, &part) == 0) return FALSE;
strcpy(part, wfd.cFileName);

// strcpy(dir[ind],next);
// strcat(dir[ind],"\\");
// strcat(dir[ind],"\\");

strcat(next, "\\");

dir=(mystr*)realloc(dir,sizeof(mystr)*(ind+1));
strcpy(dir[ind].s,next);
ind++;
// puts(next);
strcat(next, name);


SearchFolders(next, TRUE);
}
}
while (FindNextFile(hSearch, &wfd)); // ищем следующий файл

FindClose (hSearch); // заканчиваем поиск
}

if ((hSearch = FindFirstFile(lpszFileName, &wfd)) == INVALID_HANDLE_VALUE)
return TRUE;

FindClose (hSearch); // заканчиваем поиск

return TRUE;
}
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
eu6pc eu6pc вне форума
Member
 
Сообщений: 26
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.03.2011
По умолчанию 13.04.2011, 14:20

если в цикле запускать поток и тут же дожидаться его завершения, то все работает. Видимо проблема в общем доступе к чему-то глобальному... (
Ответить с цитированием
  (#7 (permalink)) Старый
Влад Влад вне форума
Специалист
 
Сообщений: 3,884
Сказал(а) спасибо: 1
Поблагодарили 25 раз(а) в 25 сообщениях
Регистрация: 27.06.2002
Адрес: Санкт-Петербург
По умолчанию 13.04.2011, 14:28

Таки нет:
d:\testing.tmp\testdir\testdir.cpp(7) : fatal error C1083: Cannot open include file: 'pthread.h': No such file or directory


The difference between theory and practice is that in theory, there is no difference between theory and practice, but in practice, there is.
Ответить с цитированием
  (#8 (permalink)) Старый
eu6pc eu6pc вне форума
Member
 
Сообщений: 26
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.03.2011
По умолчанию 13.04.2011, 14:31

Это нестандартная библиотека, ее необходимо скачать
POSIX Threads (pthreads) for Win32
и установить вручную - dll-ки в windows, *.lib- в LIB
Ответить с цитированием
  (#9 (permalink)) Старый
eu6pc eu6pc вне форума
Member
 
Сообщений: 26
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.03.2011
По умолчанию 13.04.2011, 14:36

Может быть стэка не хватает, или еще чего переполняется ?
Ответить с цитированием
  (#10 (permalink)) Старый
Angel5a Angel5a вне форума
Member
 
Сообщений: 1,213
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.02.2005
По умолчанию 13.04.2011, 21:48

eu6pc под отладчиком стек вызовов не смотрели ? что бы приблизительно хотя бы выяснить местопадения. падать может на одной и той же строке, только при доступе к разным облостям памяти.
Ответить с цитированием
  (#11 (permalink)) Старый
eu6pc eu6pc вне форума
Member
 
Сообщений: 26
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.03.2011
По умолчанию 14.04.2011, 10:01

Нет: я на VC++ впервые ). Стэк вчера крутил как мог - и стэк программы, и стэк каждого потока... как в большую так и в меньшую сторону - эффекта ноль...
Одно знаю точно - если поток запускать по одному - в цикле создаешь и сразу ждешь завершения - то все работает на ура! Но как только отпускаешь все потоки сразу (пусть даже первые 6-10) - вылетает с ошибкой...

Если закоментировать чтение из файла - тоже все работает. Как только пытаешься прочесть в потоке хотя бы 1 байт из файла - ошибка...
Может быть недопустимо функции fopen,fread,fgetc использовать в потоках ?
Ответить с цитированием
  (#12 (permalink)) Старый
<name> <name> вне форума
Новичок
 
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 23.01.2011
По умолчанию 14.04.2011, 13:29

Цитата:
Сообщение от eu6pc Посмотреть сообщение
Может быть недопустимо функции fopen,fread,fgetc использовать в потоках ?
Допустимо, если используется многопоточное CRT.
C Run-Time Libraries
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
eu6pc eu6pc вне форума
Member
 
Сообщений: 26
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.03.2011
По умолчанию 14.04.2011, 13:51

покрутил CRT туда-сюда, как указано по ссылке, эффекта 0. (
Ответить с цитированием
  (#14 (permalink)) Старый
eu6pc eu6pc вне форума
Member
 
Сообщений: 26
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.03.2011
По умолчанию 14.04.2011, 14:43

Уже разобрался: нужно было поменять свойства проекта. Поставил многопоточность - все заработало!!!!

спасибо всем за помощь!
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск исполняемых файлов zhenya.ya C++ на Unix 1 27.07.2011 16:37
Поиск файлов на трекерах tatyana-L Любые вопросы от новичков 6 23.07.2011 23:53
поиск текстовых файлов bolonka Pascal 1 05.11.2009 06:26
Поиск файлов по всем директориям Wormario WinAPI 1 06.04.2007 16:52
Поиск файлов по содержимому ic75 C++ Builder 7 26.10.2006 10:51
Поиск файлов у удаленных пользователей leon_g Общие вопросы программирования 0 27.05.2006 02:32
Быстрый поиск файлов Dian Зацените! 39 17.05.2006 14:56
Поиск файлов с системе Кошмар Юмор 4 31.05.2005 07:13
Как реализовать поиск файлов в С++ по маске Anonymous Вопросы начинающих программистов 0 24.06.2004 16:25
Поиск файлов различными способами imported_MasterX Visual C++ 3 31.03.2004 00:56
Где найти информацию о потоках Anonymous Visual C++ 6 05.02.2004 13:53



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов