Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
1 / 1 / 0
Регистрация: 30.01.2013
Сообщений: 188

Выполнение функции в несколько потоков

17.03.2014, 12:28. Показов 2289. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Вопрос следующий:
Есть рекурсивная функция DWORD WINAPI foo(LPVOID param), т.е. ее можно передавать в аргумент CreateThread. Надо выполнить ее в 4 потока, синхронизируя потоки с помощью мьютекса. Очень прошу направить меня на хотя бы примерно на верный путь. Я не понимаю, как в принципе такое может выполняться. Вот сделали мы поток для выполнения моей функции, а остальные как подключить к выполнению "того же экземпляра" этой функции?
Гугл не смог дать мне ответа на этот вопрсос(по крайней мере объяснить так, чтобы я понял).
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.03.2014, 12:28
Ответы с готовыми решениями:

Реализовать выполнение трех потоков, каждый из которых ждет завершения предыдущего
Здравствуйте, надо реализовать виполение 3-ох Threads, каждый ждет завершение предыдущего, при нажатии на кнопку: hThread =...

Почему однопоточное приложение создает несколько потоков
Оконное однопоточное приложение WinApi создает кроме главного еще 4 рабочих потока.

Найти минимум и максимум в матрице в несколько потоков
Есть пример подсчёта количества N-разрядных чисел в массиве, но как атомарно делать проверку на мин/макс я не знаю. Думаю по идее должна...

10
Заблокирован
17.03.2014, 13:13
Цитата Сообщение от ivan92 Посмотреть сообщение
а остальные как подключить к выполнению "того же экземпляра" этой функции?
что значит того же? Каждый поток запускает свой экземпляр кода конкретной функции. Синхронизировать нужно ресурсы, к которым обращается функция.
0
1 / 1 / 0
Регистрация: 30.01.2013
Сообщений: 188
17.03.2014, 13:55  [ТС]
ФараоН, тогда все еще сложнее для меня. Эта функция строит дерево каталогов(аргумент - структура, содержащая каталог и еще кое-какую int переменную). Как тогда примерно будет выглядеть код программы?
0
Заблокирован
17.03.2014, 14:00
Цитата Сообщение от ivan92 Посмотреть сообщение
Эта функция строит дерево каталогов(аргумент - структура, содержащая каталог и еще кое-какую int переменную). Как тогда примерно будет выглядеть код программы?
А куда сохраняется это дерево? Лучше код весь сюда выкладывай, сдаётся мне, что у тебя логика не правильно устроена.
0
1 / 1 / 0
Регистрация: 30.01.2013
Сообщений: 188
17.03.2014, 14:02  [ТС]
ФараоН, дерево никуда не сохраняется, а просто выводится.

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
#include <iostream>
#include <windows.h>
#include <conio.h>
 
struct treeStruct{
    wchar_t dir[MAX_PATH];
    int k;
    treeStruct(wchar_t _dir[MAX_PATH], int _k){
        wcscpy(dir, _dir);
        k=_k;
    }
    treeStruct(wchar_t _dir[MAX_PATH]){
        wcscpy(dir, _dir);
        k=0;
    }
};
 
DWORD WINAPI tree2(LPVOID param){
    treeStruct* treeParam=(treeStruct*)param;
    treeParam->k++;
    WIN32_FIND_DATA findFile;
    HANDLE handle;
    wchar_t path[MAX_PATH];
    wchar_t newPath[MAX_PATH];
    wcscpy(path, treeParam->dir);
    wcscat(path, L"*.*");   
 
    handle = FindFirstFile(path, &findFile);
    FindNextFile(handle, &findFile);
 
    while(FindNextFile(handle, &findFile))
    {
        if (findFile.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY){
            for(int i=0; i<treeParam->k-1;i++) printf("-");
            printf("Каталог    %S\n", findFile.cFileName);
            wcscpy(newPath,treeParam->dir);
            wcscat(newPath,findFile.cFileName);
            wcscat(newPath,L"\\");
            treeStruct tempTreeParam(newPath,treeParam->k);
            tempTreeParam.k=treeParam->k;
            wcscpy(tempTreeParam.dir, newPath);
            tree(tempTreeParam);
        }
    }
    FindClose(handle);
    return 0;
}
 
 
 
int main(int argc, wchar_t* argv[]){
  setlocale(LC_ALL, "Russian");
 
    treeStruct* treeParam=new treeStruct(L"E:\\Projects\\");
    HANDLE thread=CreateThread( NULL, 0, tree2, (LPVOID)treeParam, 0, NULL) ;
    
    getch();    
    return 0;
}
0
Заблокирован
17.03.2014, 14:13
Лучший ответ Сообщение было отмечено ivan92 как решение

Решение

Цитата Сообщение от ivan92 Посмотреть сообщение
tree(tempTreeParam);
здесь tree что такое?

Ты хочешь в нескольких потоках искать файлы что ли? Очень плохая логика программы, ну да ладно.
Цитата Сообщение от ivan92 Посмотреть сообщение
treeStruct* treeParam=(treeStruct*)param;
* * treeParam->k++;
* * WIN32_FIND_DATA findFile;
здесь нужно лочить мьютекс перед инкрементом k

в общем даже не знаю что тебе и посоветовать, передавай что ли в поточную функцию диапазон индексов массива под пути к файлам, тоесть чтоб каждый поток работал с определёнными индексами или же так же лочь мьютексы перед присвоением пути.... Хмм.. будет ли от такой многопоточности толк ....
0
1 / 1 / 0
Регистрация: 30.01.2013
Сообщений: 188
17.03.2014, 14:15  [ТС]
ФараоН, блин, функция tree была до этой и реализовалась как обычная void tree(treeStruct ) функция.

Добавлено через 54 секунды
ФараоН, а как тогда можно реализовать эту задачу для 4 потоков, чтобы логика была хорошей?
0
Заблокирован
17.03.2014, 14:22
Если кол-во найденных файлов заранее не известно - работай с 4-я разными массивами, потом после завершения работы потоков сливай всю инфу в один общий

Добавлено через 25 секунд
мьютексы не понядобятся
0
1 / 1 / 0
Регистрация: 30.01.2013
Сообщений: 188
17.03.2014, 14:23  [ТС]
ФараоН, по заданию нужно как раз пользоваться мьютексами для синхронизации.
0
Заблокирован
17.03.2014, 14:28
Цитата Сообщение от ivan92 Посмотреть сообщение
по заданию нужно как раз пользоваться мьютексами для синхронизации.
ну тогда на старте функции лочь мьютекс, на выходе = анлочь
0
1 / 1 / 0
Регистрация: 30.01.2013
Сообщений: 188
17.03.2014, 14:30  [ТС]
ФараоН, спасибо большое! Буду пробовать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.03.2014, 14:30
Помогаю со студенческими работами здесь

Копирование файлов из группы каталогов в несколько потоков
Добрый день.С потоками дел никогда не имел. Помогите пожалуйста сделать задачку небольшую: Обеспечить копирование файлов из группы...

Поиск и замена слов в текстовом файле в несколько потоков
Добрый день. Помогите пожалуйста разобраться с потоками. Мне необходимо: Обеспечить поиск и замену слов в текстовом файле в несколько...

Область видимости общей переменной для потоков + закрытие потоков
Есть два вопроса про потоки. Первый. Как можно сделать общую переменную для основного потока и моих ? struct ThreadInfo1 { int...

Запуск функции в потоке, создающей еще несколько потоков
Друзья подскажите, пожалуйста, выход из возникшей проблемки! Суть в следующем: есть проект Windows Forms, фреймворк 4. Раньше в главном...

вычислить значения одной и той-же функции с разными значениями, в несколько потоков
Есть задача, вычислить значения одной и той-же функции с разными значениями, которые известны изначально, в несколько потоков и вывести...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru