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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Riderik
 Аватар для Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
19.02.2012, 04:01     Одновременный вывод двух потоков в консоль #1
есть поток, который выводит числа по возрастанию. При нажатии клавиши появляется поток, выводящий числа по убыванию. То есть одновременно два потока должны выводить в консоль числа, например так:
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 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2012, 04:01     Одновременный вывод двух потоков в консоль
Посмотрите здесь:

C++ Вывод в консоль\файл
Нужно ли синхронизировать доступ к переменной из двух потоков? C++
C++ Вывод чисел на консоль
Одновременный ввод/вывод в программе C++
Вывод строки в консоль C++
Вывод в консоль из нескольких потоков C++
C++ Вывод псевдографики в консоль
Самый простой способ реализации двух параллельных потоков C++
Вывод escape в консоль C++
Вывод текста на консоль C++
C++ Вывести числа из потоков в консоль
C++ Параллельная работа двух потоков

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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