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

Одновременный вывод двух потоков в консоль - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Просьба http://www.cyberforum.ru/cpp-beginners/thread448701.html
Помогите, пожалуйста, в создании приложения. Уровень знания языков программирования ближе к 0. Суть приложения такова: при запуске .exeшника открывается окно с n-ым кол-вом кнопок. При нажатии на любую кнопку открывается определенный txt файл, если нету - то создается пустой, с определенными графами для ввода текста. Каждый введеный текст датируется числом, и, например, открыв на следущий день...
C++ Компилятор C++ Какой компилятор (Среда разработки) лучше (прогать под Windows): QT или Borland C++? http://www.cyberforum.ru/cpp-beginners/thread448673.html
C++ Как считать из файла и записать в функцию
Вот допусти у меня есть функция g_Engine.pfnAddCommand( command, NOP ); как мне в аргумент command записать строки которые находятся в ini файле, и эти стоки находятся с новой строки. а дальше выполнить функцию g_Engine.pfnAddCommand( command, NOP ); на каждую следущию строку в ini файле
Классы с++. C++
Фунты, шиллинги и пенсы Старая английская денежная система использует три единицы для хранения денежных величин: фунты, шиллинги и пенсы. Один фунт (pound) состоит из 20 шиллингов, 1 шиллинг (shilling) – из 12 пенсов (penny, pence). Самая маленькая монета («фартинг») равняется четверти пенса, поэтому все расчеты требуется вести с точностью до ¼ пенса. Требуется создать класс для хранения...
C++ Динамическое распределение памяти в функции и его возврат http://www.cyberforum.ru/cpp-beginners/thread448663.html
Обычно в курсах изложен вопрос о передаче 1- или 2-мерного массива в функцию. Не менее важно иногда вернуть результат в вызывающую программу. Что, неужели всегда надо выделять память для такого массива до передачи в функцию? код #include <iostream> #include <conio> void vvod(int **a , int n , int m) { a=new int*;
C++ Как это сделать ? [c++] Вот допустим у меня есть функция inline void fun(char* аргумент1, char *аргумент2) и есть 2 функция fun("аргумент1 ", переменая1); вопрос: подробнее

Показать сообщение отдельно
Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171

Одновременный вывод двух потоков в консоль - C++

19.02.2012, 04:01. Просмотров 1481. Ответов 0
Метки (Все метки)

есть поток, который выводит числа по возрастанию. При нажатии клавиши появляется поток, выводящий числа по убыванию. То есть одновременно два потока должны выводить в консоль числа, например так:
1 2 3 4 5 6 7 8

5 4 3 2 1

Я это реализовал с помощью запоминания и восстановления позиции курсора консоли. И всё даже работало. Сохранил программу, вышел, потом захожу - не работает) Точнее не всегда работает. Иногда выводит так:
1 2 3

2 1 4 0 59 6 8 77 8
Почему и при каких условиях я не совсем понимаю. Возможно каким-то образом инфа о курсоре из второго потока попадает в инфу первого и всё выводит в одно место. Если кто-то с таким раньше сталкивался, подскажите что тут можно сделать. Может есть какой-то способ по-лучше.

Класс для работы с курсором консоли:
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
class Cursor
{
    HANDLE h;
    CONSOLE_SCREEN_BUFFER_INFO bi;
public:
    Cursor();
    ~Cursor();
    void SavePos();
    void SetPos();
};
 
Cursor::Cursor()
{ 
    h=GetStdHandle(STD_OUTPUT_HANDLE);
    GetConsoleScreenBufferInfo(h, &bi);
}
 
Cursor::~Cursor(){}
 
void Cursor::SavePos()
{
    GetConsoleScreenBufferInfo(h, &bi);
}
 
void Cursor::SetPos()
{
    COORD pos = {bi.dwCursorPosition.X,bi.dwCursorPosition.Y}; 
    ::SetConsoleCursorPosition(h,pos);
}
Основной поток:
C++
1
2
3
4
5
6
7
8
9
10
11
    Cursor cursor;
    for(i=1; !endFirst ; i++)
    {
        cursor.SetPos();
        if(i>9) i=0;
        cout<<i<<"  ";
        cursor.SavePos();
        if(_kbhit()&&!beginSecond)
            ::_beginthread(Second,0,0);
        Sleep(500);
    }
Второй поток:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void Second(void *p)
{
    beginSecond=true;
    cout<<endl<<endl<<endl;
    Cursor cursor2;
    CLRKEY; //извлечения символа из буффера клавиатуры
    double j;
    for(j=(i+1); !_kbhit(); )
    {
        cursor2.SetPos();
        if(j<=0) j=10;
        cout<<--j<<"  ";
        cursor2.SavePos();
        Sleep(500);
    }
        endSecond=true;
}
Полный проект прилагается.
Вложения
Тип файла: zip OS_Lab1.zip (5.18 Мб, 16 просмотров)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru