powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Неблокируемый ввод
18 сообщений из 18, страница 1 из 1
Неблокируемый ввод
    #33481171
ens
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Друзья кто значет как делать?
Есть цикл:
while(1)
{
cout << "ok\n";
usleep(100000);
}
не буду объяснять что он делает
необходимо следующее: в этом цикле пользователь должен ввести строку, но так что бы цикл постоянно работал одновременно с вводом символов (независимо). Если я вставлю строку cin >> m, то на этой строке цикл остановиться и будет ждать пока юзер не введет ее (соотв. не будет выводить на экран "ok"), а мне надо что бы он постоянно крутился.
Как мне это сделать?
Спасибо!!!
...
Рейтинг: 0 / 0
Неблокируемый ввод
    #33481642
x
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
x
Гость
ensДрузья кто значет как делать?
Есть цикл:
while(1)
{
cout << "ok\n";
usleep(100000);
}
не буду объяснять что он делает
необходимо следующее: в этом цикле пользователь должен ввести строку, но так что бы цикл постоянно работал одновременно с вводом символов (независимо). Если я вставлю строку cin >> m, то на этой строке цикл остановиться и будет ждать пока юзер не введет ее (соотв. не будет выводить на экран "ok"), а мне надо что бы он постоянно крутился.
Как мне это сделать?
Спасибо!!!

по моему, без доп. потока не получиться..
...
Рейтинг: 0 / 0
Неблокируемый ввод
    #33481726
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Правильно, что-то типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
HANDLE hCin;
unsigned int threadID =  0 ;

unsigned __stdcall MyCin(void* pArg)
{
     cin >> m; 
}

main ()
{
    while( 1 )
    {
        cout << "ok\n";
        hCin = (HANDLE)_beginthreadex(NULL,  0 , &MyCin, NULL,  0 , &threadID);
        if (WaitForSingleObject(hCin,  100000 ) == WAIT_OBJECT_0)
        {
// Пользователь что-то ввел.
        }  
}
...
Рейтинг: 0 / 0
Неблокируемый ввод
    #33481729
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забыл } в wihile :)
...
Рейтинг: 0 / 0
Неблокируемый ввод
    #33481774
nikname
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
		
for(;;){
    char buf[ 100 ];
    Sleep( 1000 );
    if ( _kbhit() ){
        cin>>buf;
        if ( !strcmp(buf,"ok") )
	break;
    }
}
...
Рейтинг: 0 / 0
Неблокируемый ввод
    #33488510
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nikname
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
		
for(;;){
    char buf[ 100 ];
    Sleep( 1000 );
    if ( _kbhit() ){
        cin>>buf;
        if ( !strcmp(buf,"ok") )
	break;
    }
}


Это проблему не решает. После _kbhit() может и год пройти :)
...
Рейтинг: 0 / 0
Неблокируемый ввод
    #33490338
ens
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я слышад что можно использовать библиотеку curses.h
Но документации по ней не могу найти.
Поможет она или нет?
...
Рейтинг: 0 / 0
Неблокируемый ввод
    #33490351
ens
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы поймите что cin ипользовать нельзя.
Вот почему:
Если пользователь ничего не вводит, то все нормально печатается OK.
Если юзер начнет вводит, то пока он не завершит ввод то печататься слово OK не будет. а с помощью cin можно год ожидать пока пользователь не закончит ввод, а этого ненадо, нужно что бы прога продолжала работать...
надо что то типа с помощью getch() с буферизацией (curses.h)
но как?.....
...
Рейтинг: 0 / 0
Неблокируемый ввод
    #33490496
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Любовь к C++ вас когда-нибудь погубит.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
char palka[ 5 ] = "/|\-";
int palka_counter =  0 ;

char buf[ 100 ];
int buffer_position =  0 ;

while( 1 ) {
     printf("%c\r", palka[palka_counter]);
     palka_counter ++;
  
     if(kbhit()) {
        buf[buffer_position] = getch();
        if (buf[buffer_position] = '\n') {
            buf[buffer_position+ 1 ] =  0 ;
            printf(buf);
            break;
        }
        buffer_position ++;
    }
    sleep( 100 );
}
...
Рейтинг: 0 / 0
Неблокируемый ввод
    #33491050
_Балтика
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забыл проверочку поставить :) Вот так правильнее.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
HANDLE hCin = NULL;
unsigned int threadID =  0 ;

unsigned __stdcall MyCin(void* pArg)
{
     cin >> m; 
}

main ()
{
    while( 1 )
    {
        cout << "ok\n";
        if (hCin == NULL)
            hCin = (HANDLE)_beginthreadex(NULL,  0 , &MyCin, NULL,  0 , &threadID);
        if (WaitForSingleObject(hCin,  100 ) == WAIT_OBJECT_0)
        {
// Пользователь что-то ввел.
            hCin = NULL;
        }
    }
}
...
Рейтинг: 0 / 0
Неблокируемый ввод
    #33491141
redskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ensВы поймите что cin ипользовать нельзя.
Вот почему:....

Если делать вариант с одинм циклом на оба действия, и ввод строки, и вывод "ОК", в котором проверяется состоянии клавы (kbhit, getch и пр.) тадо будет самим отслеживать и нажатие BackSpace, Tab пр. Муторно... Если бы мне пришлось решать такую странную задачу, то я бы все-таки использовал отдельный поток для вывода. Например как-нибудь так:

Код: plaintext
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.
#include <string>
#include <iostream>
#include <unistd.h>
#include <pthread.h>

void *print_ok(void*);

using namespace std;

void *print_ok(void* p)
{
    while( 1 )
    {
        cout << "OK\n";
        sleep( 1 );
    }
}

int main()
{
    string s;
    pthread_t pt;
    pthread_create(&pt, NULL, print_ok,  0 );

    cin >> s;
    cout << "input is: " << s << endl;
    return  0 ;
}

...
Рейтинг: 0 / 0
Неблокируемый ввод
    #33491470
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ensЯ слышад что можно использовать библиотеку curses.h
Но документации по ней не могу найти.
Поможет она или нет?


Если у вас Unix не нужно тащить функции из curses
смотрите в сторону системного вызова select.

man select
select, pselect, FD_CLR, FD_ISSET, FD_SET, FD_ZERO - synchronous I/O multiplexing
SYNOPSIS
/* According to POSIX 1003.1-2001 */
#include <sys/select.h>
/* According to earlier standards */
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
The functions select wait for a number of file descriptors to change status.


Если есть что читать, спать он не будет, если читать нечего спит
пока что то не появится или просыпается по истечении
установленного в struct timeval *timeout времени.
...
Рейтинг: 0 / 0
Неблокируемый ввод
    #33496303
ens
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
простите а что такое: kbhit()

man по нему нету в Юниксе.
Как его использовать (может какой include надо делать?)
или что?
...
Рейтинг: 0 / 0
Неблокируемый ввод
    #33496845
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ensпростите а что такое: kbhit()

man по нему нету в Юниксе.
Как его использовать (может какой include надо делать?)
или что?

В UNIX есть функция лучше,
#include <sys/ioctl.h>

int ioctl(int d, int request, ...);

Ею можно проверить количество байт доступных для чтения в
файловом дискрипторе и много других вещей.

Для вашего случая можно использовать
#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd, struct flock *lock);

Ею можно установить режим неблокирующего чтения
для файлового дискриптора. Если читать нечего функция read
будет сразу же возвращать 0.
...
Рейтинг: 0 / 0
Неблокируемый ввод
    #33498334
ens
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat- ensпростите а что такое: kbhit()

man по нему нету в Юниксе.
Как его использовать (может какой include надо делать?)
или что?

В UNIX есть функция лучше,
#include <sys/ioctl.h>

int ioctl(int d, int request, ...);

Ею можно проверить количество байт доступных для чтения в
файловом дискрипторе и много других вещей.

Для вашего случая можно использовать
#include <unistd.h>
#include <fcntl.h>
int fcntl(int fd, int cmd);
int fcntl(int fd, int cmd, long arg);
int fcntl(int fd, int cmd, struct flock *lock);

Ею можно установить режим неблокирующего чтения
для файлового дискриптора. Если читать нечего функция read
будет сразу же возвращать 0.

спасибо, попробовал, но все равно вместе с этим надо использовать getch()
а у меня такая проблема. компилирую запускаю и ошибка:
Segmentation fault
Скажу сразу ошибок в коде нет!!! компиляция правильная!!!
Так что же это такое?
Один человек мне сказал:
там есть функция инициализации, которую нужно вызывать перед первым обращением к любой другой функции

А что за ф-я я так и не могу найти
HELP HELP HELP
...
Рейтинг: 0 / 0
Неблокируемый ввод
    #33498380
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ens
спасибо, попробовал, но все равно вместе с этим надо использовать getch()
а у меня такая проблема. компилирую запускаю и ошибка:
Segmentation fault
Скажу сразу ошибок в коде нет!!! компиляция правильная!!!
Так что же это такое?
Один человек мне сказал:
там есть функция инициализации, которую нужно вызывать перед первым обращением к любой другой функции

А что за ф-я я так и не могу найти
HELP HELP HELP

Если вы всетаки используете curses то действительно
нужна функция инициализации. Нужно проинициализировать библиотеку.
приблизительно так:

Код: plaintext
1.
2.
3.
4.
]

WINDOW* mainwin=initscr();


наберите в командной строке man curses и почитайте.

потом :

man initscr
initscr is normally the first curses routine.....
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Неблокируемый ввод
    #34364256
Amdei
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если не из cin, а из произвольного istream?
Как осуществить неблокируемое чтение?
Функций таких нет, метода проверки "а есть ли чего в буфере" - нет.
Отдельный поток городить всякий раз?
...
Рейтинг: 0 / 0
Неблокируемый ввод
    #34364731
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ensЯ слышад что можно использовать библиотеку curses.h
Но документации по ней не могу найти.
Поможет она или нет?

Небуферезуемый ввод. cbreak(). Читать getch(). Но нельзя путать обычный вывод с выводом курсиса. Так что лучше смотри в стороны, как здесь уже писали, селекта и контролов.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Неблокируемый ввод
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]