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

по моему, без доп. потока не получиться..
...
Рейтинг: 0 / 0
13.01.2006, 15:11
    #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
13.01.2006, 15:12
    #33481729
_Балтика
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неблокируемый ввод
Забыл } в wihile :)
...
Рейтинг: 0 / 0
13.01.2006, 15:32
    #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
18.01.2006, 08:18
    #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
18.01.2006, 19:51
    #33490338
ens
ens
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неблокируемый ввод
Я слышад что можно использовать библиотеку curses.h
Но документации по ней не могу найти.
Поможет она или нет?
...
Рейтинг: 0 / 0
18.01.2006, 19:58
    #33490351
ens
ens
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неблокируемый ввод
Вы поймите что cin ипользовать нельзя.
Вот почему:
Если пользователь ничего не вводит, то все нормально печатается OK.
Если юзер начнет вводит, то пока он не завершит ввод то печататься слово OK не будет. а с помощью cin можно год ожидать пока пользователь не закончит ввод, а этого ненадо, нужно что бы прога продолжала работать...
надо что то типа с помощью getch() с буферизацией (curses.h)
но как?.....
...
Рейтинг: 0 / 0
18.01.2006, 22:29
    #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
19.01.2006, 10:48
    #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
19.01.2006, 11:14
    #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
19.01.2006, 12:37
    #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
23.01.2006, 00:17
    #33496303
ens
ens
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неблокируемый ввод
простите а что такое: kbhit()

man по нему нету в Юниксе.
Как его использовать (может какой include надо делать?)
или что?
...
Рейтинг: 0 / 0
23.01.2006, 11:48
    #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
23.01.2006, 20:06
    #33498334
ens
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
23.01.2006, 20:41
    #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
Период между сообщениями больше года.
01.03.2007, 16:31
    #34364256
Amdei
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неблокируемый ввод
А если не из cin, а из произвольного istream?
Как осуществить неблокируемое чтение?
Функций таких нет, метода проверки "а есть ли чего в буфере" - нет.
Отдельный поток городить всякий раз?
...
Рейтинг: 0 / 0
01.03.2007, 18:29
    #34364731
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Неблокируемый ввод
ensЯ слышад что можно использовать библиотеку curses.h
Но документации по ней не могу найти.
Поможет она или нет?

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


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