Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240

обход папок в многопоточном режиме

05.02.2016, 20:43. Показов 790. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите реализовать данный код в многопоточном режиме. Заранее спасибо. Я не особо понимаю в чем ошибки, проверьте пожалуйста.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
inline std::string narrow(std::wstring const& text)
{
    std::locale const loc("Russian");
    wchar_t const* from = text.c_str();
    std::size_t const len = text.size();
    std::vector<char> buffer(len + 1);
    std::use_facet<std::ctype<wchar_t> >(loc).narrow(from, from + len, '_', &buffer[0]);
    return std::string(&buffer[0], &buffer[len]);
}
vector<thread> threads;
 
clock_t t0;
CRITICAL_SECTION cs;
std::mutex mtx;
void directory(LPCWSTR path){
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind;
    
    hFind = FindFirstFile(path, &FindFileData);
    FindNextFile(hFind, &FindFileData);
    while (FindNextFile(hFind, &FindFileData)){
        //wcout << FindFileData.cFileName << endl;
        if (FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY){
            
            static std::string _dir;
            char ch[260] = { 0 };
            char DefChar = ' ';
            char c[260] = { 0 };
            char cc[260] = { 0 };
        
            wcstombs(c, path, 260);
            for (int i = 0; i < 260; i++){
                if (c[i] != '*')
                    cc[i] = c[i];
                else{
                    cc[i] = 0;
                    break;
                }
            }
            WideCharToMultiByte(CP_ACP, 0, FindFileData.cFileName, -1, ch, 260, &DefChar, NULL);
            std::string ss(ch);
 
            _dir = cc + ss + "\\*";
            wchar_t wtext[260];
            std::mbstowcs(wtext, _dir.c_str(), strlen(_dir.c_str()) + 1);//Plus null
            LPWSTR ptr = wtext;
            
            int n=threads.size();
            if (n < 4)
            {
        //  thread th(directory, ptr);
            threads.push_back(/*move(th));//*/thread(directory, ptr));
            }
            else
            directory(ptr);
            
        }
        else{
            
        
            std::string s = narrow(FindFileData.cFileName);
            int i=s.find_last_of('.');
            std::string ss="";
            for (i; i < s.length(); i++)
                ss += s[i];
                
 
                if (ss == ".txt")
                    file++;
            
        }
        
    }
        FindClose(hFind);
        
    
}
void main()
{
    
 
    setlocale(LC_CTYPE, "Russian");
    char st[] = "D:\\E\\*";
    wchar_t wtext[20];
    std::mbstowcs(wtext, st, strlen(st) + 1);//Plus null
    LPWSTR ptr = wtext;
    t0 = clock();
    thread t(directory, ptr);
        t.join();
        for (int i = 0; i < threads.size(); i++)
            threads[i].join();
 
        clock_t t1 = clock();
        cout << "time: " << (double)(t1 - t0) / CLOCKS_PER_SEC << endl;
        cout << file;
    
    
    _getch();
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.02.2016, 20:43
Ответы с готовыми решениями:

Зависание окна в многопоточном режиме
Карочи есть проблема. Этот код работает нормально (текст меняется, прогрессбар заполняется, с формой можно делать всё что взбредет в...

Поиск чисел в массиве в многопоточном режиме
Написал программу, она ищет среди массива рандомных чисел 1 число с помощью двух потоков и в лоб(перебором), но почему-то потоки не...

Выполнение фоновых задач в многопоточном режиме
Здравствуйте, возник вопрос с многопотоковостью в ASP.MVC приложении. Есть задачи которые необходимо выполнять в фоновом режиме в разных...

1
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
07.02.2016, 22:18  [ТС]
Помогите пожалуйста, никак не могу сделать этот рекурсивный обход с многопоточностью. Вон пытался 2 способами, но вечные ошибки, не могу понять, что я не так делаю.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <cstdlib>
#include <vector>
#include <iostream>
#include <thread>
#include <mutex>
 
 
using namespace std;
std::vector<std::wstring> strList;
std::recursive_mutex mtx;
std::mutex mt;
 
 
int file = 0;
typedef struct
{
    LPCWSTR path;
    int numb;
} MsParams_t;
 
vector<HANDLE> eve;
vector<HANDLE> threads;
int n = 0,stop=0;
std::string convert(LPCTSTR  l){
    mt.lock();
#ifdef UNICODE // conversion only required in this case
    std::string s;
    size_t len = _tcslen(l) + 1;
    char* buf = new char[len]; // allocate temp. buffer
 
    wcstombs(buf, l, len); // do the conversion
 
    s = buf; // assign to 'std::string'
 
    delete[] buf; // clean up
#else
    s = l; // not UNICODE, just assign it
#endif
    mt.unlock();
    return s;
}
 
clock_t t0;
HANDLE hThr;
DWORD WINAPI directory(void * param){
    WIN32_FIND_DATA FindFileData;
    MsParams_t * ptr = (MsParams_t *)param;
    HANDLE hFind;
 
    hFind = FindFirstFile(ptr->path, &FindFileData);
    FindNextFile(hFind, &FindFileData);
    while (FindNextFile(hFind, &FindFileData)){
    //  wcout << FindFileData.cFileName << endl;
        if (FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY){
            
            static std::string _dir;
            
 
        
            std::string ss = convert(ptr->path);// = narrow(ptr->path);
            std::string s = convert(FindFileData.cFileName);//narrow(FindFileData.cFileName);
            
            ss.erase(ss.find('*'), 1);
 
            _dir = ss + s + "\\*";
            wchar_t wtext[260];
            std::mbstowcs(wtext, _dir.c_str(), strlen(_dir.c_str()) + 1);//Plus null
            
        /*  mtx.lock();
            if (n < 4)
        {
        
            //eve.push_back(CreateEvent(NULL, FALSE, FALSE, L""));
            */
            static MsParams_t params;
            params.path = wtext;
            params.numb = n;
            threads.push_back(CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)directory, (void*)&params, 0, NULL));
            //thread tr((void*)&params);
            //events.push_back(CreateEvent(NULL, FALSE, FALSE, L""));
            //threads.push_back(/*move(th));//*/
            
            //thread(directory, wtext,n));
            cout << "thread add" << endl;
            //n++;
            //}
            /*else{
                static MsParams_t params;
                params.numb = ptr->numb;
                params.path = wtext;
                directory((void*)&params);
            }*/
 
        //LeaveCriticalSection(&cs);
            //mtx.unlock();
        }
        else{
            std::string s = narrow(FindFileData.cFileName);
            int i=s.find_last_of('.');
            std::string ss="";
            for (i; i < s.length(); i++)
                ss += s[i];
            if (ss == ".txt"){
                file++;
            //  cout << file;
            }
        }
    }
    if (ptr->numb > -1){
        SetEvent(eve[ptr->numb]);
        //cout << "set" << endl;
        stop++;
    }
        FindClose(hFind);
        //cout << "thread stopped" << endl;
        //CloseHandle(threads[ptr->numb]);
        return 0;
}
void main()
{
 
//  thread tt(del);
    static MsParams_t params;
    setlocale(LC_CTYPE, "Russian");
    char st[] = "E:\\start\\*";
    wchar_t wtext[20];
    std::mbstowcs(wtext, st, strlen(st) + 1);//Plus null
    LPWSTR ptr = wtext;
    t0 = clock();
    
    //hThr = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)directory, (void*)&params, 0, NULL);
    params.path = ptr;
    params.numb = -1;
    directory((void*)&params);
    
    
 
    /*for (int j = 0; j < eve.size(); j++){
        WaitForSingleObject(eve[j], INFINITE);
        CloseHandle(threads[j]);
        cout << "event stop"<< endl;
    }*/
    while (stop == 3);//уже в тупую не ожидал завершения события, просто накапливал переменную
    //for (int i = 0; i < 4; i++){
    //  threads[i].join();
    //  cout << "thread stopped" << endl;
    //}
        clock_t t1 = clock();
        cout << "time: " << (double)(t1 - t0) / CLOCKS_PER_SEC << endl;
        cout << file<<endl;
    
    _getch();
}
и 2 способ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <cstdlib>
#include <vector>
#include <iostream>
#include <thread>
#include <mutex>
 
 
using namespace std;
std::vector<std::wstring> strList;
std::recursive_mutex mtx;
std::mutex mt;
 
 
int file = 0;
typedef struct
{
    LPCWSTR path;
    int numb;
} MsParams_t;
 
inline std::string narrow(std::wstring const& text)
{
    
    std::locale const loc("Russian");
    wchar_t const* from = text.c_str();
    std::size_t const len = text.size();
    std::vector<char> buffer(len + 1);
    std::use_facet<std::ctype<wchar_t> >(loc).narrow(from, from + len, '_', &buffer[0]);
    return std::string(&buffer[0], &buffer[len]);
    
}
vector<HANDLE> eve;
vector<HANDLE> threads;
int n = 0,stop=0;
std::string convert(LPCTSTR  l){
    mt.lock();
#ifdef UNICODE // conversion only required in this case
    std::string s;
    size_t len = _tcslen(l) + 1;
    char* buf = new char[len]; // allocate temp. buffer
 
    wcstombs(buf, l, len); // do the conversion
 
    s = buf; // assign to 'std::string'
 
    delete[] buf; // clean up
#else
    s = l; // not UNICODE, just assign it
#endif
    mt.unlock();
    return s;
}
void directory1(MsParams_t ptr){
    WIN32_FIND_DATA FindFileData;
    
    HANDLE hFind;
 
    hFind = FindFirstFile(ptr.path, &FindFileData);
    FindNextFile(hFind, &FindFileData);
    while (FindNextFile(hFind, &FindFileData)){
        //  wcout << FindFileData.cFileName << endl;
        if (FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY){
 
            static std::string _dir;
 
 
 
            std::string ss = convert(ptr.path);// = narrow(ptr->path);
 
            std::string s = convert(FindFileData.cFileName);//narrow(FindFileData.cFileName);
            ss.erase(ss.find('*'), 1);
 
            _dir = ss + s + "\\*";
            wchar_t wtext[260];
            std::mbstowcs(wtext, _dir.c_str(), strlen(_dir.c_str()) + 1);//Plus null
 
            mtx.lock();
            if (n < 4)
            {
                static MsParams_t params;
                params.path = wtext;
                params.numb = n;
                thread tr(directory1,params);
                cout << "thread add" << endl;
                n++;
            }
            else{
                static MsParams_t params;
                params.path=wtext;
                params.numb = ptr.numb;
                directory1(params);
            }
            mtx.unlock();
        }
        else{
            std::string s = narrow(FindFileData.cFileName);
            int i = s.find_last_of('.');
            std::string ss = "";
            for (i; i < s.length(); i++)
                ss += s[i];
            if (ss == ".txt"){
                file++;
            
            }
        }
    }
    if (ptr.numb > -1){
        
        stop++;
    }
    FindClose(hFind);
    
}
clock_t t0;
HANDLE hThr;
void main()
{
 
//  thread tt(del);
    static MsParams_t params;
    setlocale(LC_CTYPE, "Russian");
    char st[] = "E:\\start\\*";
    wchar_t wtext[20];
    std::mbstowcs(wtext, st, strlen(st) + 1);//Plus null
    LPWSTR ptr = wtext;
    t0 = clock();
    
    //hThr = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)directory, (void*)&params, 0, NULL);
    params.path = ptr;
    params.numb = -1;
    
    
    
    directory1(params);
    /*for (int j = 0; j < eve.size(); j++){
        WaitForSingleObject(eve[j], INFINITE);
        CloseHandle(threads[j]);
        cout << "event stop"<< endl;
    }*/
    while (stop == 3);
    //for (int i = 0; i < 4; i++){
    //  threads[i].join();
    //  cout << "thread stopped" << endl;
    //}
        clock_t t1 = clock();
        cout << "time: " << (double)(t1 - t0) / CLOCKS_PER_SEC << endl;
        cout << file<<endl;
    
    _getch();
}
Всеравно не выходит, так функция работает, проверял, все хорошо. А в многопоточном то 1 поток не запускается то ошибки в строках, вообщем точной ошибки я не видел, ну и ни разу не работало все хорошо. Помогите с этой бедой, заранее спасибо.

Добавлено через 11 минут
Понял что ошибка тут
C++
1
while (stop == 3);
должно быть так
C++
1
while (stop < 3);
, но все равно не работает(

Добавлено через 10 минут
Вобще это реально сделать на чистых ++, писал на дот все отлично работает, тут уже 5 день ковыряюсь? Когда зацикливаю 1 поток, все остальные не работают, тут я так понимаю проблема в приоритетах, предназначен ли чистый С++ для многопоточности?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.02.2016, 22:18
Помогаю со студенческими работами здесь

Как сохранять список в многопоточном режиме
Есть список lst. В нем список урл. Через Parallel.For я делаю гет-запросы и манипулирую с данными. Как мы понимаем данные из списка берутся...

Подсчёт числа пи в многопоточном режиме с помощью mpi.h
Подскажите, пожалуйста, программу, которая считает число pi до 100 знака после запятой. Распараллелено на mpi и нет. Спасибо.

Различия в точности вычисления в одно/многопоточном (OMP) режиме
Различия в точности, скорости вычисления в одно/многопоточном (OMP) режиме Привет. Стала задача оптимизировать софт и ускорить за...

Как работать через одно соединение с БД в многопоточном режиме?
Как, я думаю, вы уже знаете для работы с PostgreSQL сначала необходимо установить соединение с базой данных, затем используя данное...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru