Tôi muốn viết chương trình C trên linux, làm mới màn hình liên tục và cập nhật nó trong thời gian thực (ví dụ, tương tự như lệnh top
trong thiết bị đầu cuối). Ai đó có thể chỉ cho tôi phương hướng đúng không.Làm thế nào để làm mới màn hình liên tục và cập nhật nó trong thời gian thực
Trả lời
Để giữ thiết bị di động trên các loại thiết bị đầu cuối, bạn cần phải sử dụng thư viện như ncurses. Kiểm tra liên kết đó, một hướng dẫn đầy đủ của nó.
Dưới đây là một chương trình cơ bản mà in một số lượng ngày càng tăng ở góc trên bên trái của màn hình:
#include <stdio.h>
#include <ncurses.h>
int main (void)
{
/* compile with gcc -lncurses file.c */
int c = 0;
/* Init ncurses mode */
initscr();
/* Hide cursor */
curs_set (0);
while (c < 1000) {
/* Print at row 0, col 0 */
mvprintw (0, 0, "%d", c++);
refresh();
sleep (1);
}
/* End ncurses mode */
endwin();
return 0;
}
Thats cách bạn làm mới cửa sổ. Bây giờ, nếu bạn muốn hiển thị các hàng dữ liệu như top
, dữ liệu bạn hiển thị cần được duy trì trong cấu trúc dữ liệu được sắp xếp (tùy thuộc vào dữ liệu của bạn, nó có thể đơn giản như một mảng hoặc danh sách liên kết). Bạn sẽ phải sắp xếp dữ liệu dựa trên bất cứ điều gì logic của bạn ra lệnh và viết lại vào cửa sổ (như được hiển thị trong ví dụ trên) sau một số clear()
hoặc wclear()
.
Ncurses có thể là cách để thực hiện. Kể từ khi bạn nói chương trình, sau đó ncurses, c, c + +. Nhìn vào tất cả. Nhưng nếu bạn có kế hoạch làm một cái gì đó "shelL" liên quan, đi với perl.
Chỉnh sửa: Để thêm vào quan điểm của tôi, dưới đây là một số mô-đun có thể cung cấp cho bạn ý tưởng.
http://metacpan.org/pod/Curses::UI::Dialog::Progress
http://metacpan.org/pod/Smart::Comments
window.clrtobot()
Và đối với biện pháp tốt, một cuộc gọi cho lời nguyền để xóa toàn bộ cửa sổ.
Cũng như sử dụng thư viện ncurses để xử lý màn hình, nếu bạn muốn cập nhật "liên tục" và "trong thời gian thực", bạn có thể cũng muốn xem bộ tính giờ và xử lý tín hiệu. timer_create()
và timer_settime()
có thể giúp bạn hẹn giờ, sau đó bạn có thể sử dụng sigaction()
để đặt chức năng xử lý để bẫy tín hiệu SIGALRM
và cập nhật.
EDIT: Dưới đây là một số mẫu mã, theo yêu cầu:
#define TIMESTEP 200000000
timer_t SetTimer(void) {
struct itimerspec new_its;
struct sigevent sevp;
timer_t main_timer;
sevp.sigev_notify = SIGEV_SIGNAL;
sevp.sigev_signo = SIGALRM;
timer_create(CLOCK_REALTIME, &sevp, &main_timer);
new_its.it_interval.tv_sec = 0;
new_its.it_interval.tv_nsec = TIMESTEP;
new_its.it_value.tv_sec = 0;
new_its.it_value.tv_nsec = TIMESTEP;
timer_settime(main_timer, 0, &new_its, NULL);
return main_timer;
}
void SetSignals(void) {
struct sigaction sa;
/* Fill in sigaction struct */
sa.sa_handler = handler;
sa.sa_flags = 0;
sigemptyset(&sa.sa_mask);
/* Set signal handler */
sigaction(SIGALRM, &sa, NULL);
}
void handler(int signum) {
switch (signum) {
case SIGALRM:
update_stuff(); /* Do your updating here */
break;
}
}
Bạn có thể cung cấp mã mẫu này không? –
@ sr01853: Chắc chắn, tôi đã chỉnh sửa câu trả lời để thêm ví dụ. –
Như những người khác đã nói, bạn có thể muốn nhìn vào thư viện ncurses. Nhưng nếu bạn không cần định dạng tiên tiến, có lẽ một cái gì đó đơn giản như thế này có thể đủ:
#include <stdio.h>
#include <unistd.h>
int main(void) {
int number = 0;
while (1) {
++number;
printf("\rThe number is now %d.", number);
fflush(stdout);
sleep(1);
}
return 0;
}
Nếu bạn dưới xterm
hoặc VT100
tương thích, bạn có thể tận dụng console codes, ví dụ:
#include <stdio.h>
#include <unistd.h> /* for sleep */
#define update() printf("\033[H\033[J")
#define gotoxy(x, y) printf("\033[%d;%dH", x, y)
int main(void)
{
update();
puts("Hello");
puts("Line 2");
sleep(2);
gotoxy(0, 0);
puts("Line 1");
sleep(2);
return(0);
}
Bạn có thể thực hiện hầu hết mọi thứ bằng các chuỗi thoát, nhưng as pointed out in wikipedia: ncurses
tối ưu hóa các thay đổi màn hình để giảm độ trễ khi sử dụng các vỏ từ xa.
Bạn nên sử dụng 'fputs (..., stdout)' thay vì 'printf (...)'. –
@LS_dev, bạn đã đúng, chỉnh sửa –
Tôi đã tham chiếu trong '# define' ... Trong' main', 'puts' sẽ là đủ. –
Tùy thuộc vào trường hợp của bạn, bạn có thể sử dụng lệnh "xem" trên dòng lệnh để xem nhanh như trên cùng. Bạn cũng có thể xem nhiều lệnh cùng một lúc.
ví dụ:
watch 'ls -l <somefile>; ps -fC <someprocess>; ./some_script'
- 1. Thực thể Khung làm mới và cập nhật đồng thời
- 2. Làm cách nào để buộc QGLWidget cập nhật màn hình?
- 3. CAEmitterLayer làm thế nào để phát ra trong một thời gian ngắn liên tục
- 4. Làm thế nào để liên tục cập nhật một phần của trang
- 5. Làm thế nào để cập nhật các thực thể liên quan trong Entity Framework
- 6. cập nhật biến javascript với ajax trong thời gian thực
- 7. Tôi làm cách nào để truy xuất các bản ghi được cập nhật trong thời gian thực? (thông báo đẩy?)
- 8. Làm thế nào để cập nhật counter_cache khi cập nhật một mô hình?
- 9. Làm thế nào để cập nhật mô hình Ember.Route động?
- 10. Thực hành tốt nhất: Cập nhật ArrayAdapter liên tục
- 11. Làm thế nào để thực hiện cập nhật hàng loạt?
- 12. Làm thế nào để thay đổi thời gian chờ màn hình lập trình?
- 13. Buộc Flex cập nhật màn hình?
- 14. Làm cách nào để tự động cập nhật dấu thời gian trong PostgreSQL
- 15. Làm cách nào để tính chiều cao và chiều rộng màn hình tại thời gian chạy?
- 16. Làm thế nào để thực hiện và cập nhật chính xác thanh tiến trình trong cocos2d?
- 17. Bản đồ mảng và bản đồ băm liên tục trong thời gian truy cập của chúng như thế nào?
- 18. MySQL tạo thời gian và thời gian cập nhật dấu thời gian
- 19. Lỗi làm mới OAuth2 API Google Drive thời gian thực
- 20. Làm thế nào để tạo một hồ sơ Firefox (liên tục) mới với Selenium bằng Python?
- 21. Làm thế nào để Xoay ảnh liên tục?
- 22. Làm thế nào để tạo cookie liên tục trong asp.net?
- 23. php shell_exec với thời gian thực cập nhật
- 24. Làm thế nào để bạn đặt thời gian và chỉ thời gian trong lịch trong Java?
- 25. Làm cách nào để bạn trực quan hóa các tệp nhật ký trong thời gian thực?
- 26. Làm thế nào để cập nhật ngày và/hoặc thời gian của hệ thống sử dụng .NET
- 27. Làm cách nào để buộc UIWebView cập nhật khi màn hình tắt?
- 28. Thời gian không cập nhật trong heroku
- 29. Làm thế nào để mở dự án từ không gian làm việc trong nhật thực?
- 30. CouchDB cập nhật đẩy thời gian thực Ajax
http://en.wikipedia.org/wiki/Ncurses – devnull
Hãy xem tới [ncurses] (http://www.tldp.org/HOWTO/NCURSES-Programming- HOWTO /) –
Hãy xem [ncurses] (http://www.gnu.org/software/ncurses/) –