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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
#1

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

19.02.2012, 04:01. Просмотров 1572. Ответов 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;
}
Полный проект прилагается.
0
Вложения
Тип файла: zip OS_Lab1.zip (5.18 Мб, 16 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2012, 04:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Одновременный вывод двух потоков в консоль (C++):

Вывод в консоль из нескольких потоков - C++
Здравствуйте. В программе выводятся данные на консоль из нескольких потоков, из-за чего в консоли получается мешанина. Можно ли как-нибудь...

Одновременный ввод/вывод в программе - C++
Проблема такая: нужно одновременно и выводить и вводить в программу. Т.е. мне надо, чтобы, даже пока программа ожидает ввода от...

Вывести числа из потоков в консоль - C++
Есть два отдельных потока, в которых генерируются разные числа. Как вывести эти числа в консоль в разных строках и что бы в консоль не...

Реализовать вывод массива объектов типа Student на консоль (файловый ввод/вывод) - C++
Как сделать чтобы список студентов выводился на экран в конце? #include&lt;iostream&gt; #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; ...

Параллельная работа двух потоков - C++
Добрый день ! Подскажите пожалуйста , как сделать так, что-бы один поток считывал строки, а другой считал буквы и слова ? ...

Нужно ли синхронизировать доступ к переменной из двух потоков? - C++
Допустим есть два потока: основной и вторичный. 1. И допустим есть глобальная переменная bool b; Вопрос: является ли b...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2012, 04:01
Привет! Вот еще темы с ответами:

Самый простой способ реализации двух параллельных потоков - C++
Здравствуйте. Покажите самый простой способ реализовать два параллельных вычисления при помощи потоков.

Вывод в консоль - C++
Код без ошибок (VS не ругается при компиляции)! Но консоль не хочет выводить сообщений.. В чем может быть проблема? В консоли виден...

Вывод результатов работы потоков разными цветами - C++
Реализую параллельную сортировку методом Шелла. При этом нужно показать, какие перестановки какой из потоков выполнил, разукрасив строки...

Вывод текста на консоль в C++ - C++
парни, необходимо перевести строку printf (&quot;%5d&quot;, a); в с++. интересует как записать “%5d” в с++


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

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

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