С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
 Аватар для Vadim00311
1 / 1 / 0
Регистрация: 22.10.2016
Сообщений: 105

Подождать завершения потока

14.05.2019, 21:37. Показов 4961. Ответов 3

Студворк — интернет-сервис помощи студентам
В общем то я начинающий программист c++. Уже третий день сижу над решение задачи:
Разработать переносимый (portable) класс ThreadPool. Объект этого класса содержит несколько потоков, находящихся в состоянии ожидания. К объекту можно обратиться с запросом выполнить некоторый метод некоторого объекта в потоке. Для выполнения процедуры объект класса ThreadPool подключает поток из пула ожидающих потоков. (Доп. задание: класс ThreadPool должен работать на Windows и Linux).
Получилось вот что:
class ThreadPool.h
C++
1
2
3
4
5
6
7
8
9
#pragma once
#include <Windows.h>
class ThreadPool
{
public:
    ThreadPool();
    ~ThreadPool();
    void addPoll(VOID(__stdcall *)(ULONG_PTR));
};
class ThreadPool.cpp
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
#include "pch.h"
#include "ThreadPool.h"
#include <IOstream>
#include <Windows.h>
 
const int _SOME_MAGIC_VALUE = 5;
 
DWORD CALLBACK trd1(LPVOID);
VOID CALLBACK APCProc(ULONG_PTR);
HANDLE hEvent;
DWORD trd_id;
HANDLE hThread;
 
using namespace std;
ThreadPool::ThreadPool()
{
    hEvent = CreateEvent(0, false, false, NULL);
    trd_id = 0;
    hThread = CreateThread(0, 0, trd1, hEvent, CREATE_SUSPENDED, &trd_id);
    cout << "Thread id is 0x" << hex << trd_id << endl;
}
 
 
ThreadPool::~ThreadPool()
{
    WaitForSingleObject(hThread, 1000);
    CloseHandle(hThread);
}
 
 
void ThreadPool::addPoll(VOID(__stdcall * Func)(ULONG_PTR))
{
    ResumeThread(hThread);
    int i = 0;
    QueueUserAPC(Func, hThread, ++i);
}
 
 
DWORD CALLBACK trd1(LPVOID p)
{
    HANDLE hEvent = (HANDLE)p;
    SetEvent(hEvent);
    int i = 0;
    while (i < _SOME_MAGIC_VALUE) {
        SleepEx(INFINITE, true);
        cout << i++ << endl;
    }
    return 0;
}
class main
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
#include "pch.h"
#include <IOstream>
#include "ThreadPool.h"
#include <Windows.h>
 
using namespace std;
 
 
VOID CALLBACK APCFunc_1(ULONG_PTR dwParam)
{
    cout << " METOD MAIN_1#" << (int)dwParam << "_" << GetCurrentThreadId() << endl;
}
 
VOID CALLBACK APCFunc_2(ULONG_PTR dwParam)
{
    cout << " METOD MAIN_2#" << (int)dwParam << "_" << GetCurrentThreadId() << endl;
}
 
VOID CALLBACK APCFunc_3(ULONG_PTR dwParam)
{
    cout << " METOD MAIN_3#" << (int)dwParam << "_" <<  GetCurrentThreadId() << endl;
}
 
VOID (CALLBACK * message[3])(ULONG_PTR);
 
int main() {
    setlocale(LC_ALL, "Rus");
    message[0] = APCFunc_1;
    message[1] = APCFunc_2;
    message[2] = APCFunc_3;
    ThreadPool * pol = new ThreadPool();
    for (int i = 0; i < 3; i++)
        pol->addPoll(message[i]);
    Sleep(1000); //Если убрать паузу, то главный класс не дождется завершение потока класса ThreadPool и завершит работу
    std::cout << "Programma okonchena \n";
    return 0;
}
Во время решения задачи у меня возникло несколько вопросов: Как в главном классе "грамотно" дождаться завершения выполнения всех процессов класса ThreadPool без применения Sleep() ? 2. Как после завершения выполнения функций перевести поток снова в режим "ожидания". 3. Правильно ли я очередь организовываю (хотя все работает, но мне кажется за каждой итерацией просто создается новый процесс, а не выстраивается очередь)? Если есть возможность помогите, очень сложно для меня эта тема пошла
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.05.2019, 21:37
Ответы с готовыми решениями:

Как дождаться завершения потока?
void Thread(void* pParam); void main(){ _beginthread(Thread, 0, NULL);//Запускаем поток, он выполняет свои задачи.... //Тут...

Как подождать завершения Task?
Есть WPF приложение, в нем в определённый момент запускается такая штука: Task fillTable = new Task(() =&gt; { ...

Как подождать завершения приложения (по имени окна)
Бывает что мы запускаем какую та программу программно и нужно дождаться ее завершения. Можно конечно отслеживать процесс и т.п. или имя...

3
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
14.05.2019, 22:23
Цитата Сообщение от Vadim00311 Посмотреть сообщение
Разработать переносимый (portable) класс ThreadPool.
Я так понимаю, тебе нужно использовать std::thread, а не winapi
0
 Аватар для Vadim00311
1 / 1 / 0
Регистрация: 22.10.2016
Сообщений: 105
14.05.2019, 22:26  [ТС]
Я потом допилю еще определения #ifdef _WIN какой то код #endif #ifdef _UNIX какой то код #endif для линукса. Пока что я для виндовс сделать хочу
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
14.05.2019, 22:33
Лучший ответ Сообщение было отмечено Vadim00311 как решение

Решение

Создаёшь очередь заданий std::list<std::function<void()>> tasks;
Создаёшь массив потоков std::vector<std::thread>>, несколько штук
Для синхронизации используешь std::mutex и std::condition_variable cv;

Потоки ждут в цикле , пока в очереди появится задание - cv.wait
Кладёшь задание в очередь - task.push_back и делаешь cv.notify_one; (всё под мьютексом)
Поток видит, что очередь не пуста, берёт оттуда задание (task.pop_front), выходит из цикла ожидания, разблокирует мьютекс и выполняет задание;

Добавлено через 53 секунды
Цитата Сообщение от Vadim00311 Посмотреть сообщение
Я потом допилю еще определения #ifdef _WIN какой то код #endif #ifdef _UNIX какой то код #endif для линукса.
Не допилишь. Там всё в принципе разное
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.05.2019, 22:33
Помогаю со студенческими работами здесь

Как подождать завершения нескольких потоков, и если после минуты не завершились продолжать выполнение?
Как подождать завершения нескольких потоков, и если после минуты не завершились продолжать выполнение программы дальше?

Завершения потока
Можно как-нить запустить новый поток, только после того как завершится первый???

Ждем завершения потока
Здравствуйте. Помогите разобраться новичку. Пытаюсь объединить аудио с видео и получить сообщения из ffmpeg.exe при выполнении. В конце...

Дождаться завершения потока
Как заставить это дожидаться завершения потока перед тем как продолжить? for ((i = 0); i &lt; qwe; i++) { url = &quot;blablabla; ...

Ожидание завершения потока
private void button1_Click(object sender, EventArgs e) { System.Threading.Thread MyThread1 = ...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru