Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
6 / 7 / 2
Регистрация: 22.05.2019
Сообщений: 40
1

Не работают getch() и cin в двух разных потоках на ввод одновременно/Как снизить нагрузку на процессор?

27.10.2019, 20:11. Показов 674. Ответов 4
Метки нет (Все метки)

Код:
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <thread>
 
// g++ th.cpp -o th -lws2_32 -std=c++11
 
#define ENTER   13
#define ESQ     27
 
using namespace std;
 
void thFunc(unsigned short *tFst)
{
    while(1) {
        *tFst = getch();
    }
}
 
int main()
{
    unsigned short state = 0;
    thread th1(thFunc, &state);
    th1.detach();
    string text;
    while(state != ESQ) {
        if(state == ENTER) {
            cin >> text;
            cout << text << endl;
            state = 0;
        }
    }
    return 0;
}
В функции main() в цикле 1 поток на ввод строки cin, в другом потоке одновременно с этим сканируются введенные клавиши. К сожалению, задумка не работает, должен быть ввод getch(), либо cin отдельно.

Как реализовать работу 2 потоков ввода одновременно? Что мне для этого нужно?

Есть предположения: для решение проблемы нужен win api, либо сделать 2 потока на уровне потока istream(или 2 самих istream), либо я еще не изучил полностью стандартную библиотеку многопоточности(mutex, atomic и т.д.), которая поможет с этой проблемой, а также есть мысли, что есть специальные операции ввода/вывода для многопоточных программ. Подскажите, верны мои догадки, если нет, то объясните, пожалуйста, в чем проблема?

Также подскажите, как снизить нагрузку на процессор в многопоточных программах, ведь моя мелкая программа грузит процессор на 25%. Есть мысли, что нужно использовать задержку в цикле, но разве сама задержка по типу вымышленной функции "wait(2000ms)" не является сама циклом счетчиком времени? Компьютер, чтобы "подождать", должен считать, сколько подождать, он не может заснуть на 2 секунды и проснутся. Задержка не дает исполнить последующие команды до истечения назначенного времени, это все для чего она годится. Также есть мысли об разворачивании цикла, но пока еще не тестил это. Если долго объяснять, то скиньте ссылки на ресурсы с ответом.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.10.2019, 20:11
Ответы с готовыми решениями:

Как снизить нагрузку на процессор?
Здравствуйте! Есть сайт, у которого посещаемость в среднем 25к-30к в сутки. Недавно сменили...

Как максимально снизить нагрузку на процессор?
Здравствуйте! Помогите пожалуйста с одним вопросом. Подскажите как максимально снизить нагрузку на...

Может ли один делегат одновременно работать в двух разных потоках?
Вечер добрый. Такой вопрос. Я так понимаю, один делегат не может одновременно работать в двух...

Как запустить метод класса одновременно в разных потоках?
Как запустить метод класса одновременно в разных потоках? Будет ли конфликт между ними, или создать...

4
6 / 7 / 2
Регистрация: 22.05.2019
Сообщений: 40
28.10.2019, 14:07  [ТС] 2
бамп
0
6737 / 4537 / 1838
Регистрация: 07.05.2019
Сообщений: 13,725
Записей в блоге: 1
28.10.2019, 14:19 3
Цитата Сообщение от DiceLine Посмотреть сообщение
Как реализовать работу 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
#inlcude <mjutex>
 
static std::mutex _mx;
void thFunc(unsigned short *tFst)
{
    while(1) {
std::lock_guard<std::mutex> lock(_mx);
        *tFst = getch();
    }
}
 
int main()
{
    unsigned short state = 0;
    thread th1(thFunc, &state);
    th1.detach();
    string text;
    while(state != ESQ) {
std::lock_guard<std::mutex> lock(_mx);
        if(state == ENTER) {
 
            cin >> text;
            cout << text << endl;
            state = 0;
        }
    }
    return 0;
}
Добавлено через 2 минуты
Цитата Сообщение от DiceLine Посмотреть сообщение
Также подскажите, как снизить нагрузку на процессор в многопоточных программах, ведь моя мелкая программа грузит процессор на 25%.
Это грузит функция main, в которой крутится цикл без задержек.
Здесь тебе надо усыплять поток в этом цикле при помощи std::condition_variable
1
6 / 7 / 2
Регистрация: 22.05.2019
Сообщений: 40
28.10.2019, 14:22  [ТС] 4
Смысл в самой логике программы, чтобы можно было выйти в любом месте программы, даже при вводе. Пример: человек передумал/устал вводить текст и хочет выйти из программы удобным способом, как раз getch с привязкой к ESQ очень удобно.

Спасибо за мьютексы, посмотрю что это. Отпишу, если будут вопросы, надеюсь поможете.
0
6737 / 4537 / 1838
Регистрация: 07.05.2019
Сообщений: 13,725
Записей в блоге: 1
28.10.2019, 14:22 5
Хотя, с мьютексом эта проблема проявляться не будет, но появится другая - поток thFunc может надолго заблокировать поток main (если последний не будет успевать заблокировать мьютекс)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.10.2019, 14:22

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Чем отличается ввод с a=getch() от cin>>a;
Например цикл. while(a!='\n') { cin&gt;&gt;a; } Если нажать Ентер цикл завершится. В отличии от...

Как снизить нагрузку на ПК
раньшее у меня стояла виндовс 7 домашняя базовая... ела оч мало ресурсов, нагрузка при выключеных...

Как снизить нагрузку на базу
Опишу проблему: Есть база в миллион записей, и скрипт который с ней работает. Скрипт делает...

Как снизить нагрузку на сервер
Сайт созданный на Joomla сильно грузит сервер, приходят сообщения от хостера. Материала на сайте не...

Объясните пожалуйста как работают cin.good(), cin.sync(), cin.clear()
Такая проблема: сдаю в вуза лабораторные по программированию, писал все сам, до этого c++ не...

Insert разных таблиц в нескольких потоках (одновременно) в access
Всем привет, хочу в несколько потоков вставлять данные в разные таблицы в базе access (.mdb,...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.