Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
#1

Реализация многопоточности в консоли - C++

09.05.2013, 16:32. Просмотров 684. Ответов 14
Метки нет (Все метки)

Доброго времени суток.
Не могу разобраться в многопоточности. Реализовано перемещение по меню с помощью клавиш, и с помощью мыши. Надо как-то это все объединить, чтобы в любой момент времени я мог перемещаться либо мышью, либо клавишами.
Буду благодарен за любую информацию о многопоточности.
Спасибо.

Добавлено через 23 минуты
Надо чтобы параллельно отрабатывалась как проверка на координаты мыши, так и проверка на нажатие клавиши. Как это сделать ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2013, 16:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Реализация многопоточности в консоли (C++):

Реализация многопоточности в GUI приложении - C++
Здравствуйте! Заранее извиняюсь за, возможно, глупые вопросы по поводу этой темы, но они все-таки возникли ^_^ Стоит задача...

Реализация разветвляющегося меню в консоли - C++
Привет!, Помогите написать код что бы При Нажатие клавиши 1 выполнился код после if (option == 1) #include <iostream> using...

Реализация UNIX команды "cat" в консоли Windows с использованием WinAPI - C++
В консоли Linux есть команда "cat", аналог которой надо сделать под консоль Windows на языке C++. Требуется реализация посредством WinAPI....

Реализация команды "cat" в консоли Windows - C++
В общем задание следующее: В консоли Linux есть команда "cat", аналог которой надо сделать под консоль Windows на языке C++. В идеале...

О многопоточности - C++
Интересно, стало, а сколько всего потоков я могу открыть в своем проекте, существуют ли какие нибудь ограничения? и от чего зависит...

Производительность многопоточности - C++
Доброго времени суток. Решил заняться многопоточностью, и натолкнулся на непонимание с производиельность Есть код в 2 потока: ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
stima
463 / 312 / 26
Регистрация: 22.03.2011
Сообщений: 1,021
Завершенные тесты: 2
09.05.2013, 16:37 #2
Причем тут консоль? Причем тут многопоточность?
art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
09.05.2013, 16:45  [ТС] #3
Ну программа консольная.
А многопоточность. Как по-другому назвать, то что мне надо?
stima
463 / 312 / 26
Регистрация: 22.03.2011
Сообщений: 1,021
Завершенные тесты: 2
09.05.2013, 16:54 #4
В "консольной программе" нет понятия "мыши" и "клавиш". Есть только стандартные потоки ввода и вывода. Опишите задачу полностью
art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
09.05.2013, 17:00  [ТС] #5
Я реализовал псевдографическое меню. Считывание нажатия клавиши для перехода по пунктам меню (то есть стрелка вверх, вниз) осуществляется с помощью функции getch(), библиотеки conio.h.
Так же у меня реализован (отдельно) выбор пункта меню с помощью нажатия ЛКМ (тут мы получаем координаты и в зависимости от них выделяем черным цветом (все остальные темно-серым) нужный пункт меню).
Я хочу, чтобы мы могли совместить эти два способа. Нажимаю на клавишу вниз, переходим вниз, сразу беру мышку и навожу на любой пункт меню и выделяется он.

Добавлено через 15 секунд
То есть отдельно у меня реализованы эти задачи. Осталось совместить.
stima
463 / 312 / 26
Регистрация: 22.03.2011
Сообщений: 1,021
Завершенные тесты: 2
09.05.2013, 17:11 #6
Цитата Сообщение от art3330 Посмотреть сообщение
Я хочу, чтобы мы могли совместить эти два способа. Нажимаю на клавишу вниз, переходим вниз, сразу беру мышку и навожу на любой пункт меню и выделяется он.
Прочитайте это несколько раз. Здесь есть что-то что нужно распараллеливать?

п.с. И да это оконное приложение в котором окном служить windows консоль.
art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
09.05.2013, 17:25  [ТС] #7
Просто если реализуем через getch(), то в тот момент когда подходит выполнение этой функции, у нас не будет работать мышь, а будет происходить ожидание нажатия клавиши.

Добавлено через 11 секунд
Не знаю, как решить эту проблему.
stima
463 / 312 / 26
Регистрация: 22.03.2011
Сообщений: 1,021
Завершенные тесты: 2
09.05.2013, 17:38 #8
Покажите код. Кажется Вы не договариваете, а именно о использовании <windows.h>.
А вообще это задача реализуеться через WinApi. Через дискриптор окна, его loop и т.д.
art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
09.05.2013, 18:13  [ТС] #9
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
int main()
{
    system("mode con lines=15 cols=15");
    string menu[10]={
        "Один",
        "Два",
        "Три",
        "Четыре",
        "Пять",
        "Шесть",
        "Семь",
        "Восемь",
        "Девять",
        "Победа",
    };
    int size_menu=10;
    COORD c; // переменная, отвечающая за координаты в консоли
    system("color F0");
    HANDLE h_in=GetStdHandle(STD_INPUT_HANDLE); // дескриптор окна для работы с мышкой
    SetConsoleMode(h_in,ENABLE_MOUSE_INPUT); // установка режима использования мышки
 
    INPUT_RECORD all_events[1]; // массив событий, произошедших в консоли
    DWORD read_event; // переменная, в которую запишется количество произошедших событий
    bool flag=true;
    while(1){
        system("cls");
        ReadConsoleInput(h_in,all_events,1,&read_event); // получить все события, произошедшие в консоли    
        // пройтись по всем событиям
        c.X=all_events[0].Event.MouseEvent.dwMousePosition.X; // запомнить координаты мышки
        c.Y=all_events[0].Event.MouseEvent.dwMousePosition.Y;
        SetColor(0,15);
        if(c.Y<1 || c.Y>size_menu){
            for(int k=0; k<size_menu;k++){
                SetColor(8,15);
                cout<<"\n  "<<menu[k];
            };
            flag=false;
        }
        else{flag=true;};
        if(flag==true){
            for(int k=0; k<size_menu;k++){
                if(k==c.Y-1){   
                    SetColor(0,15);
                } 
                else {
                    SetColor(8,15);
                };
                cout<<"\n  "<<menu[k];
            };
            if(all_events[0].Event.MouseEvent.dwButtonState==FROM_LEFT_1ST_BUTTON_PRESSED){
                if(c.Y==10){
                    system("cls"); // если нажата левая кнопка мыши
                    SetColor(0,15);
                    cout<<"\n\n   You Win\n\n";
                    system("pause");
                    return 0;
                }
                else{
                    system("cls"); // если нажата левая кнопка мыши
                    SetColor(0,15);
                    cout<<"\n\n   You Lose\n\n";
                    system("pause");
                    return 0;
                };
            }
        }
    }
    return 0;
};
stima
463 / 312 / 26
Регистрация: 22.03.2011
Сообщений: 1,021
Завершенные тесты: 2
09.05.2013, 18:30 #10
Ну вот )) Теперь ясно ... Вот вам последовательность (заметьте не параллельность)
1. Вывели меню. Разукрасили пункт по умолчанию. Ждем ввода.
2. Обработали ввод польователя (нажатие стрелки) запомнили какая стрелка была нажата.
3. Перерисовали меню с учетом нажатой стрелки. Ждем ввода.
и т.д.
art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
09.05.2013, 18:37  [ТС] #11
stima, Вы меня немного не поняли. Сейчас попробую разъяснить. С помощью использования клавиш у меня есть функция. Вот она
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
    int menu(string title,string menu[],int size){
            int i=0;
            int code=0;
            unsigned max=title.size();
            for (int k=0; k<size; k++){
                if(menu[k].size()>max){max=menu[k].size();};
            };
            if (max<10){max=9;}
            objectConsole.setsize(size+3,max+4);
            while (code!=27){
                objectConsole.SetColor(0,15);
                for(unsigned int g=0; g<(max-title.size())/2;g++){
                        cout<<" ";
                };
                cout<<"  "<<title<<"\n";
                for(int k=0; k<size;k++){
                    if(k==i){   
                        objectConsole.SetColor(0,15);
                    } 
                    else {
                        objectConsole.SetColor(8,15);
                    };
                    cout<<"\n  "<<menu[k];
                };
                code=getch();
                switch(code){
                    case 80:{i++; if (i==size){i=0;}; break;};
                    case 72:{i--; if (i==-1){i=size-1;}; break;};
                    case 27: return -1;;
                    case 13: return i;
                };
                objectConsole.clearscreen();
            };  
            return 0;
        };
Я хочу совместить выбор пункта меню с помощью мыши, и с помощью клавиш. Как это сделано, например , в любом контекстном меню. Захотел, перемещаюсь мышью, захотел, клавишами. Понятная моя мысль?
stima
463 / 312 / 26
Регистрация: 22.03.2011
Сообщений: 1,021
Завершенные тесты: 2
09.05.2013, 18:50 #12
Есть 2 варианта.
1. Раз вы уже используете winapi то используйте не getch.
C++
1
2
3
4
5
6
7
8
9
10
MSG msg;
   while(GetMessage(&msg, console_hwnd, 0, 0) > 0) //это ваш луп
   {
    //pseudo code
    if (msg.type == WM_MOUSE_MOVE) on_mouse_move();
    else if (msg.type == WM_BUTTON PRESSET && msg.button == VK_DOWN) on_down();
    
     TranslateMessage(&msg);
     DispatchMessage(&msg);
   }
2. Пренести обработку событий движения мышки в другой поток. Но так не делается.
art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
10.05.2013, 16:30  [ТС] #13
Спасибо. А не могли бы Вы разъяснить код (хватит комментариев), просто с винАПИ я пока что на вы. И почему не делается перенос мыши в другой порок?

Добавлено через 21 час 30 минут
Не работает данный код. Выдает ошибки, что
C++
1
2
3
4
5
6
7
8
9
error: 'console_hwnd' was not declared in this scope
error: 'MSG' has no member named 'type'
error: 'WM_MOUSE_MOVE' was not declared in this scope
error: 'on_mouse_move' was not declared in this scope
error: 'MSG' has no member named 'type'
error: 'WM_BUTTON' was not declared in this scope
error: expected ')' before 'PRESSET'
error: 'on_down' was not declared in this scope
Сборка завершилась с ошибкой.
хотя windows.h подключен
stima
463 / 312 / 26
Регистрация: 22.03.2011
Сообщений: 1,021
Завершенные тесты: 2
10.05.2013, 17:31 #14
Читайте внимательней. Там написано "псевдокод", а значит это только идея и/или пример.

п.с. Вы даже не попытались поискать, что к чему.
art3330
10 / 10 / 1
Регистрация: 16.12.2012
Сообщений: 141
11.05.2013, 01:23  [ТС] #15
stima, я не заметил этой строчки. Буду искать. Спасибо =)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.05.2013, 01:23
Привет! Вот еще темы с ответами:

Синхронизации многопоточности - C++
добрый день, пытаюсь сделать синхронизацию потом на примере producer\consumer, но что-то не выходит, я в consumere сделал ожидания...

изучение многопоточности - C++
с чего стоит начать изучение многопоточности? есть базовые знания по С++, основы ООП. пытался читать Назарр К., Рихтер Дж. - Windows via...

Управление потоками в многопоточности - C++
вопрос простой: что посоветуете почитать по теме для начинающего? с помощью чего проще реализовать? windows/linux? (нужно просто...

Теория о многопоточности и многопроцессорности - C++
Ребят, возник вот такой вопрос: в каком случае многопоточность и многопроцессорность не будут работать?


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
11.05.2013, 01:23
Ответ Создать тему
Опции темы

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