Giả lập đồng hồ (clock) trên console bằng C++

sử dụng gotoxy để vẽ lại đồng hồ, có tác dụng gì khác là in ra 1 cách bt bằng cách gọi hàm in clock nhi?

đâu có làm vậy được. Lúc nào cũng phải lấy thời gian thực hết, sao tự đếm được. Vì trên máy ko phải chỉ có 1 chương trình chạy, mà cả chục chương trình chạy với nhau, mỗi chương trình sẽ thay phiên nhau xài CPU. Vì vậy chương trình bạn chạy sẽ có lúc nhanh (được phép xài CPU liên tục), lúc chậm (xài CPU cách khoảng, hoặc chờ khá lâu mới được phép xài, vd anti-virus đang chạy thì nó sẽ chiếm CPU nhiều hơn) nên chỉ dựa vào vòng for để đếm thời gian là ko bao giờ chính xác.

1 Like

như trên có mấy bác chỉ lấy thời gian theo chu kì

với việc tách hàm run_time ra thành các hàm con cho từng hành động thì có tối ưu hơn k nhỉ
vì như thế mỗi hàm chỉ có vài hàng, hàm này gọi hàm kia thì có tệ hơn là để trong cùng 1 hàm và đánh đổi bằng " if "

void run_time(){
		milisecond++;
		if (milisecond == 60){
			milisecond = 0;
			cout << "\a";
			second++;
			if (second >= 60){
				second = 0;
				minute++;
				if (minute == 60){
					minute = 0;
					hour++;
					if (hour == 24){
						hour = 0;
						day++;
						if (day == 1 + day_month(month)){
							day = 1;
							month++;
							if (month == 13){
								month = 1;
								year++;
								if (year == 2081){   // clock only run to 2080
									cout << "Out of battery" << endl;
									system("pause");
									exit(0);
								}
							}
						}
					}
				}
			}
		}
	}

trong hàm run_time()vòng do...while(1) thì lấy

time_t currentTimestamp = time(NULL); //số giây tính từ UNIX epoch (1/1/1970)
if (currentTimestamp > prevTimestamp) //prevTimestamp lưu như 1 biến của clock_console. Khi khởi tạo thì gán luôn prevTimestamp = time(NULL)
{
    prevTimestamp = currentTimestamp; //update prevTimestamp
    clock_12h(); //chỉ vẽ lại khi có thay đổi ở số giây
}

để tránh đốt CPU thì trong vòng do ... while(1); thêm vô Sleep(16);

do
{
    time_t currentTimestamp = time(NULL); //số giây tính từ UNIX epoch (1/1/1970)
    if (currentTimestamp > prevTimestamp) //prevTimestamp lưu như 1 biến của clock_console. Khi khởi tạo thì gán luôn prevTimestamp = time(NULL)
    {
        prevTimestamp = currentTimestamp; //update prevTimestamp
        clock_12h(); //chỉ vẽ lại khi có thay đổi ở số giây
        calender_number();
    }
    Sleep(16); //include <windows.h>
}
while (1);
2 Likes

nghĩa là cứ lấy rồi cập nhật, lấy rồi cập nhật, chứ k thể tự thân nó vận động à? chỉ lấy lần đầu, còn lại tự chạy

ko. Nó tự chạy thì ko đúng. 1 giây có thể nó chạy được 1000 vòng lặp, đếm đủ 1000ms = 1 giây, nhưng khi bạn bật Chrome lên, bật scan virus, bật defrag disk, v.v… thì 1 giây nó chỉ còn chạy được 10 vòng lặp, đếm 10ms, ko đúng 1 giây.

máy tính có 1 bộ phận đếm giờ riêng thì phải, time(NULL) là lấy thời gian này ra. Đó chính là thời gian thực. Thật ra nếu bạn có kết nối internet thì bộ phận này cũng có thể phải lấy thời gian từ internet xuống cho đồng bộ, chứ nó chạy cũng ko đúng 100%, ví dụ 1 ngày lệch 1 giây chẳng hạn.

trừ phi máy tính của bạn chỉ dùng để đếm giờ (ko bao giờ có chuyện này, bạn bật task manager lên thì xem có bao nhiêu tiến trình đang chạy hiện tại, toàn trên 20 process) thì 1 vòng do…while có thể đếm đúng , nhưng cũng có sai số, vd 1 giây chạy được 999-1001 vòng lặp, ko bao giờ đúng 1000 mãi mãi được.

3 Likes

hình như thời gian của hệ thống nó chạy trên bios, được nuôi bởi 1 con pin cmos riêng, nên nó k bị ảnh hưởng với mt
ý mình là giờ có cách nào ngoài cách gettime liên tục ấy :3
chứ k thì đồng hồ này vứt đi :smile: đồng hồ mà sai h thì chỉ có vứt rồi

cái này là bạn đo bằng hàm có sẵn hay là xem ở tài liệu nào vậy

phán đại thôi. Có thể là 1200 vòng, 10 ngàn vòng, 60 ngàn vòng v.v… ko biết được. CPU nhanh thì số vòng càng nhiều, CPU cùi bắp thì số vòng càng ít.

2 Likes

chắc thử lên stackoverflow xem có tây nào có cách k :3 cứu vãn lấy e đồng hồ fake

muốn chính xác thì phải truy time(NULL) liên tục thôi, ko có cách nào khác đâu =)

2 Likes

Get time liên tục thì có vấn đề gì nhỉ ?

1 Like

kiểu như cái đồng hồ nó k tự thân vận động ấy, nhưng chắc cũng chỉ có cách đó :3 mà như bạn (anh) nói ở trên thì vẽ đồng hồ ra có thể dùng bộ đệm , là như thế nào nhỉ

1 Like

Bạn có thể dùng 1 module thời gian thực gắn ngoài và giao tiếp qua USB hoặc com.
http://hshop.vn/products/mach-thoi-gian-thuc-rtc-ds1307

giới hạn ct chỉ viết bằng những thứ cơ bản của c++ thôi anh ạ, e mới học c++, nên ct nhỏ nhỏ này e chỉ muốn làm 1 cách cơ bản nhất
nên e cũng k sư dụng thư viện windows hay các thứ khác

mình chạy thấy kim giây tăng bình thường mà? Màn hình chớp quá thôi…

chạy xong, để đó tầm 1p sẽ thấy sai giờ, nhanh hoặc chậm, hoặc có thể lấy đồng hồ thật ra so,
vì kim ms chạy bằng vòng lặp, nên do độ trễ của hàm in clock với kiểm tra đk if, lặp, nên đồng hồ chạy k ổn định, khi nhanh khi chậm, do ảnh hướng bới máy tính, nghĩa là thời gian đúng hay k lại bị phụ thuộc bời khả năng xử lý của mt

mình muốn tách ra, thời gian k bị phụ thuộc bởi tốc độ xử lý của mt, nhưng lại k muốn cứ get time hệ thông rồi in ra liên tục, chỉ muốn lấy 1 lần rồi nó tự chạy và có thể đúng giờ như tg của hệ thống

lỡ đào lên khi merge topic :frowning:

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