Hỏi về đồng hồ đếm ngược trong bài tập thi trắc nghiệm c++

Chào mọi người em đang là sinh viên năm 2 đang làm bài tập lớn về chương trình thi trắc nghiệm cho sinh viên. Thầy yêu cầu khi sinh viên chọn số phút thi thì phải điền đáp án trong khoảng thời gian đó. Hiện em đang bị lỗi chỗ nếu như để thời gian tự chạy hết thì chương trình đứng và lỗi luôn còn nếu nộp bài trước khi thời gian kết thúc thì hoạt động bình thường thì có cách nào xử lý không ạ. Em cảm ơn ạ.

    struct ThoiGian
    {
    	int Gio;
    	int Phut;
    	int Giay;
    };
    void WriteBlockChar(wchar_t* Arraych, int row, int col, int x, int y, int color)
    {
    	CHAR_INFO* charater = new CHAR_INFO[row * col];
    	for (int i = 0; i < row * col; i++) 
    	{
    		charater[i].Attributes = color;
    		charater[i].Char.UnicodeChar = Arraych[i];
    	}
    	COORD sizebuff = { col,row };
    	COORD pos = { 0,0 };
    	SMALL_RECT earea = { x,y,x + col - 1,y + row - 1 };
    	WriteConsoleOutput(GetStdHandle(STD_OUTPUT_HANDLE), charater, sizebuff, pos, &earea);
    	delete[] charater;
    }

    wchar_t InToA(int k)
    {
    	switch (k) 
    	{
    	case 0: return L'0';
    	case 1: return L'1';
    	case 2: return L'2';
    	case 3: return L'3';
    	case 4: return L'4';
    	case 5: return L'5';
    	case 6: return L'6';
    	case 7: return L'7';
    	case 8: return L'8';
    	case 9: return L'9';
    	default: return L' '; // Return a space if not a valid digit
    	}
    }

    bool DoiGio(ThoiGian* h) 
    {
    	if (h->Giay > 0)
    	{
    		--h->Giay;
    	}
    	else if (h->Phut > 0) 
    	{
    		h->Giay = 59;
    		--h->Phut;
    	}
    	else if (h->Gio) 
    	{
    		--h->Gio;
    		h->Phut = 59;
    		h->Giay = 59;
    	}
    	else return 0;
    	return 1;
    }

    void ThemVaoChuoi(wchar_t* h, ThoiGian* j) 
    {
    	int bait = 0;
    	bait = j->Giay;
    	h[7] = InToA(bait % 10);
    	h[6] = InToA(bait /= 10);
    	bait = j->Phut;
    	h[4] = InToA(bait % 10);
    	h[3] = InToA(bait /= 10);
    	bait = j->Gio;
    	h[1] = InToA(bait % 10);
    	h[0] = InToA(bait /= 10);
    }

    void InDongHo(int phut) 
    {
    	ThoiGian h = { 0, phut, 0 };
    	wchar_t a[8] = { L'0',L'0',L':',L'0',L'0',L':',L'0',L'0' };
    	while (stop) 
    	{
    		if (!DoiGio(&h)) stop = 0;
    		ThemVaoChuoi(a, &h);
    		WriteBlockChar(a, 1, 8, 70, 3, 0x004);
    		Sleep(950);
    	}
    	return;
    }
PHẦN HÀM MAIN:
    						cout << "Nhap so phut thi: ";
    						cin >> thoigianthi;

    						clock = thread(InDongHo, thoigianthi);
    						stop = true;

    						for (int i = 0; i < soluongcauhoi; i++) 
    						{
    							InCauHoiThi(TimCauHoi(ketqua[i]));
    						}

    						for (int i = 0; i < soluongcauhoi; i++) 
    						{
    							cin >> dapansv[i];
    							if (dapansv[i] == bangbam[ketqua[i]]->Dapan)
    							{
    								diemthi += diemthi1cau;
    							}
    						}
    						while (stop) {
    							if (std::cin.get() == '\n') 
    							{
    								stop = false;
    							}
    							clock.detach();
    						}

Câu chuyện là nếu h->Gio < 0 thì sao hả bạn?

2 Likes

Dạ không được do thực ra em chỉ để nhập phút, số giờ em để mặc định là 0 ạ.

sao cái clock.detach() lại để ở trong vòng lặp while thế kia

sao lại cần detach mà ko phải join()?

sao lại đi xài thread? Nếu xài windows thì có hàm kbhit() để nhập input ko block main thread gì mà. Code ví dụ: Giới hạn thời gian cho người dùng nhập, nếu hết thời gian thì thông báo hết giờ

1 Like

Dạ em cảm ơn a. Dùng detach() vì join() thì phải chạy xong nó mới cho nhập ạ. Do lần đầu tiếp xúc nên không rành lắm, em sẽ tham khảo code ạ

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?