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

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

Восстановить пароль Регистрация
 
art3330
 Аватар для art3330
9 / 9 / 1
Регистрация: 16.12.2012
Сообщений: 141
09.05.2013, 16:32     Реализация многопоточности в консоли #1
Доброго времени суток.
Не могу разобраться в многопоточности. Реализовано перемещение по меню с помощью клавиш, и с помощью мыши. Надо как-то это все объединить, чтобы в любой момент времени я мог перемещаться либо мышью, либо клавишами.
Буду благодарен за любую информацию о многопоточности.
Спасибо.

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

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

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

Добавлено через 11 секунд
Не знаю, как решить эту проблему.
stima
429 / 284 / 16
Регистрация: 22.03.2011
Сообщений: 923
Завершенные тесты: 1
09.05.2013, 17:38     Реализация многопоточности в консоли #8
Покажите код. Кажется Вы не договариваете, а именно о использовании <windows.h>.
А вообще это задача реализуеться через WinApi. Через дискриптор окна, его loop и т.д.
art3330
 Аватар для art3330
9 / 9 / 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
429 / 284 / 16
Регистрация: 22.03.2011
Сообщений: 923
Завершенные тесты: 1
09.05.2013, 18:30     Реализация многопоточности в консоли #10
Ну вот )) Теперь ясно ... Вот вам последовательность (заметьте не параллельность)
1. Вывели меню. Разукрасили пункт по умолчанию. Ждем ввода.
2. Обработали ввод польователя (нажатие стрелки) запомнили какая стрелка была нажата.
3. Перерисовали меню с учетом нажатой стрелки. Ждем ввода.
и т.д.
art3330
 Аватар для art3330
9 / 9 / 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
429 / 284 / 16
Регистрация: 22.03.2011
Сообщений: 923
Завершенные тесты: 1
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
 Аватар для art3330
9 / 9 / 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
429 / 284 / 16
Регистрация: 22.03.2011
Сообщений: 923
Завершенные тесты: 1
10.05.2013, 17:31     Реализация многопоточности в консоли #14
Читайте внимательней. Там написано "псевдокод", а значит это только идея и/или пример.

п.с. Вы даже не попытались поискать, что к чему.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.05.2013, 01:23     Реализация многопоточности в консоли
Еще ссылки по теме:

C++ Чтение/запись в файл с использованием многопоточности
Синхронизации многопоточности C++
Реализация многопоточности в GUI приложении C++

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

Или воспользуйтесь поиском по форуму:
art3330
 Аватар для art3330
9 / 9 / 1
Регистрация: 16.12.2012
Сообщений: 141
11.05.2013, 01:23  [ТС]     Реализация многопоточности в консоли #15
stima, я не заметил этой строчки. Буду искать. Спасибо =)
Yandex
Объявления
11.05.2013, 01:23     Реализация многопоточности в консоли
Ответ Создать тему
Опции темы

Текущее время: 12:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru