01/10/2018, 14:17

Làm thế nào để cho người dùng nhập dữ liệu trong vòng x giây mà không nhập xong thì chuyển sang lệnh khác vây ạ?

Trong c++ thì làm thế nào để mình cho nhập dữ liệu từ bàn phím trong vòng x giây r nếu ko nhập xong thì sẽ chuyển sang lệnh khác vậy ạ?
Cảm ơn mọi người
=-=’

Dark.Hades viết 16:32 ngày 01/10/2018

Đây là phần sử dụng api của os, chứ stl của c++ chưa hỗ trợ cái này.
Như std::cin nó cũng phải pause app lại chờ người dùng nhập, bạn có thể thực hiện đếm time tại đây, nhưng người dùng phải submit thì mới chạy lệnh phía dưới đc

1 cách khác là chuyển hàm nhập sang một thread khác, giữ pointer biến nhận dữ liệu rồi xử lí ở thread chính

Florastamine viết 16:21 ngày 01/10/2018

Hình như có std::this_thread::sleep_for mà nhỉ (phải include <chrono><thread>, btw)

á nhầm, thớt đòi phải đếm trong lúc nhập

viết 16:28 ngày 01/10/2018

1 cách khác là chuyển hàm nhập sang một thread khác, giữ pointer biến nhận dữ liệu rồi xử lí ở thread chính

trên Windows xài kbhit kết hợp với getch gì đó

viết 16:19 ngày 01/10/2018

thử 2 cái cái nào thấy được thì chôm đi

cái thứ 2 ngon hơn, thấy có còm men nhiều mà đọc cũng chả hiểu mình còm men cái gì

#include <iostream>
#include <conio.h>
#include <windows.h>
#include <ctime>

char timedCharInput(unsigned sec);

int main()
{
    std::cout << "Quick, enter a letter: ";
    char in = timedCharInput(2);
    if (!in) std::cout << "You're too slow.\n";
    else     std::cout << "Your response is " << in << '\n';
}

char timedCharInput(unsigned sec)
{
    clock_t stop = clock() + sec * CLOCKS_PER_SEC;
    char ret = '\0';
    while (clock() <= stop) {
        if (_kbhit()) {
            char c = _getch();
            if (c == '\b' || c == 0x7f) {
                if (ret) std::cout << "\b \b";
                ret = '\0';
            } else if (c == '\r' || c == '\n') {
                std::cout << '\n';
                return ret;
            } else {
                if (ret) std::cout << "\b \b";
                std::cout << c;
                ret = c;
            }
        }
        Sleep(16); // don't rape your CPU!
    }
    std::cout << '\n';
    return '\0';
}
#include <conio.h>
#include <windows.h>
#include <string>
#include <iostream>
#include <cstdio>

///////////////////////////////////////////////////////////////////////
/// \brief Input with time limit.
/// Prevent user from inserting more input after time limit has been spent.
/// \param timeLeft Time limit, in milliseconds.
/// \param maxLen Maximum input length (to prevent long input that
/// causes a new line).
/// \return Input string.
///////////////////////////////////////////////////////////////////////
std::string timedLineInput(unsigned int timeLeft, size_t maxLen = 40);

int main()
{
    std::string s = timedLineInput(11000);
    std::cout << s << "\n";
}

std::string timedLineInput(unsigned int timeLeft, size_t maxLen)
{
    std::string buff;
    size_t cursorIndex = 0;
    DWORD deadline = GetTickCount() + timeLeft;
    while (1)
    {
        DWORD now = GetTickCount();
        timeLeft = deadline < now ? 0 : deadline - now;
        if (!timeLeft) break;
        if (kbhit())
        {
            int ch = getch();
            if (ch == '\r' || ch == '\n') break;
            if (ch == '\b') //backspace
            {
                if (!buff.empty()) //there is character to delete
                {
                    buff.erase(--cursorIndex, 1);
                    printf("\b \b"); //delete last character on screen (a hack)
                }
            }
            else if (ch == 0xE0) //DEL, arrow keys, ... emits 2 characters 0xE0
            {
                ch = getch();    //and this character
                if (ch == 0x53) //DEL
                {
                    if (!buff.empty())
                    {
                        if (cursorIndex == buff.size())
                        {
                            buff.erase(--cursorIndex);
                            printf("\b \b");
                        }
                        else
                        {
                            buff.erase(cursorIndex, 1);
                        }
                    }
                }
                else if (ch == 0x4b) //left arrow
                {
                    if (cursorIndex > 0) cursorIndex--;
                }
                else if (ch == 0x4d) //right arrow
                {
                    if (cursorIndex < buff.size()) cursorIndex++;
                }
                else if (ch == 0x47) //Home
                {
                    cursorIndex = 0;
                }
                else if (ch == 0x4f) //End
                {
                    cursorIndex = buff.size();
                }
            }
            else if (buff.size() < maxLen)
            {
                buff.insert(cursorIndex++, 1, ch);
            }
        }
        printf("\r%79s", ""); //clear line
        //5 is magic number for time limit < 100s.
        //For 100s < time limit < 1000s use 6, or convert to minutes...
        printf("\r%5.2fs    %s", timeLeft / 1000.0, buff.c_str());
        //set cursor position without gotoxy...
        printf("\r%5.2fs    %s", timeLeft / 1000.0, buff.substr(0, cursorIndex).c_str());
        Sleep(5); //decrease this number until there is no blinking on screen
    }
    printf("\r%5.2fs    %s\n", timeLeft / 1000.0, buff.c_str());
    return buff;
}

Florastamine viết 16:25 ngày 01/10/2018

Đó là lý do mình chẳng biết gì về console I/O của C++ và chẳng bao giờ muốn biết

Dark.Hades viết 16:27 ngày 01/10/2018

trên Windows xài kbhit kết hợp với getch gì đó

Yep, căn bản là không biết thớt dùng os nào, với lại đó là api của windows chứ không phải của C++ nên e không khuyên xài [quote=“Dark.Hades, post:2, topic:62011”]
Đây là phần sử dụng api của os, chứ stl của c++ chưa hỗ trợ cái này
[/quote]

明玉 viết 16:29 ngày 01/10/2018

2 post ở gần cuối link này có 2 giải pháp cho Windows và Unix (như Ubuntu hoặc MacOS)
http://www.cplusplus.com/forum/beginner/5619/#msg25047

Nguyễn Minh Đức viết 16:21 ngày 01/10/2018

hix, cảm ơn các bác nhiều =-=’

Bài liên quan
0