Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
16 / 16 / 11
Регистрация: 28.10.2016
Сообщений: 75
1

Проверить, завершит ли функция работу за X мс. (Потоки)

25.12.2017, 22:22. Показов 1043. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую читающих сию тему.
Проблема такая: Захотел написать функцию, которая проверяет, вернёт ли функция значение за заданное время, или нет. Если да, мгновенно вернуть true, иначе, по истечению времени, false.
P.s. Я знаю, что пишу велосипед, и что это можно было сделать гораздо проще но всё-таки.
Вот, что получилось:
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
#include <iostream>
#include <conio.h>
#include <thread>
 
using namespace std;
 
template<typename Function, typename... Args>
bool returnedInMilliseconds(unsigned long long milliseconds, Function fn, Args... arg)
{
    volatile bool returned = false, timeOver = false;
    
    auto fn1 = []
    (Function _fn)
    {
        _fn(arg);
        returned = true;
    };
 
    auto waitFn = []
    (unsigned long long ms)
    {
        _sleep(ms);
        timeOver = true;
    };
 
    _STD thread t1(fn1, fn);
    _STD thread t2(_sleep, milliseconds);
 
    while (1)
    {
        if (returned)
            return true;
        if (timeOver)
            return false;
    }
}
 
int main()
{
    
    cout << boolalpha << returnedInMilliseconds(5000, _getch);
 
    return 0;
}
Получается что-то такое:
Ошибка C3493 "returned" нельзя передать неявно, поскольку не задан режим передачи по умолчанию.
Ошибка C3493 "timeOver" нельзя передать неявно, поскольку не задан режим передачи по умолчанию.

Выручайте, кто чем может.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.12.2017, 22:22
Ответы с готовыми решениями:

Завершит ли работу функция, если в блоке отсутствует "return"
Подскажите пожалуйста, как правельно выходить из функции. Например: private function func(){...

Эта программа не позволяет ос виндовс завершит работу компьютера
У меня такая проблема,выключаю комп,экран затемняется и пишет,что Эта программа не позволяет ос...

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

Потоки завершаются, не закончив работу
Здравствуйте, у меня такая проблема, потоки убиваются сразу после запуска. При одном потоке все...

3
73 / 69 / 38
Регистрация: 09.10.2012
Сообщений: 238
25.12.2017, 22:37 2
Если только по ошибке, то:

C++
1
2
3
4
5
6
auto waitFn = [&]
(unsigned long long ms)
{
    _sleep(ms);
    timeOver = true;
};
А для решения задачи можно воспользоваться
C++
1
std::future
и
C++
1
std::promise
.
1
16 / 16 / 11
Регистрация: 28.10.2016
Сообщений: 75
25.12.2017, 23:38  [ТС] 3
Я тут понял, что я немного дурак... В общем, если вам не трудно, можете показать, как это сделать? (Используя стандартную библиотеку)
0
73 / 69 / 38
Регистрация: 09.10.2012
Сообщений: 238
26.12.2017, 22:41 4
Лучший ответ Сообщение было отмечено Kodirovsshik как решение

Решение

Как вариант (что конкретно нужно в вашей задаче я не знаю, поэтому немного абстрактно):

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
#include <thread>
#include <future>
#include <iostream>
 
void test_function()
{
    std::cin.get();
}
 
template<typename Function, typename... Args>
bool returnedInMilliseconds(unsigned long long milliseconds, Function fn, Args... args)
{
    std::promise<void> promise;
    const std::future<void> future = promise.get_future();
 
    std::thread thread([&]
    {
        try {
            fn(std::forward<Args>(args)...);
            promise.set_value();
        }
        catch (...) {
            // Если вызвать у future метод get, то он выкинет пойманное тут исключение
            promise.set_exception(std::current_exception());
        }
    });
 
    // Тут зависит от вашей задачи
    thread.detach();
 
    const auto status = future.wait_for(std::chrono::milliseconds(milliseconds));
    return status == std::future_status::ready;
}
 
int main()
{
    const bool returned = returnedInMilliseconds(1000, &test_function);
    std::cout << std::boolalpha << returned;
    return 0;
}
Из не очень красивого - detach потока и отсутствие получения возвращаемого значения функции. Всё это решается, но надо смотреть конкретную цель.
1
26.12.2017, 22:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.12.2017, 22:41
Помогаю со студенческими работами здесь

Потоки! Как сделать работу потоков по очереди?
Всем привет! Помогите разобраться! Дано: 5 потоков, они генерят по очереди сообщения. public...

Потоки и таймеры - настроить параллельную работу потока и двух таймеров
Добрый день. Подскажите пожалуйста, как корректно настроить парралельную работу потока и двух...

Закрытие программы только после того, как работу закончат все потоки
У меня есть 30 потоков, обычные threads, их 30 штук. Каждый поток выполняет определенный алгоритм....


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru