2013-08-27 72 views
20

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

+6

http://en.wikipedia.org/wiki/Ncurses – devnull

+1

Hãy xem tới [ncurses] (http://www.tldp.org/HOWTO/NCURSES-Programming- HOWTO /) –

+1

Hãy xem [ncurses] (http://www.gnu.org/software/ncurses/) –

Trả lời

27

Để 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().

7

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ổ.

3

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()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; 
    } 
} 
+0

Bạn có thể cung cấp mã mẫu này không? –

+0

@ sr01853: Chắc chắn, tôi đã chỉnh sửa câu trả lời để thêm ví dụ. –

2

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; 
} 
6

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.

+0

Bạn nên sử dụng 'fputs (..., stdout)' thay vì 'printf (...)'. –

+0

@LS_dev, bạn đã đúng, chỉnh sửa –

+0

Tôi đã tham chiếu trong '# define' ... Trong' main', 'puts' sẽ là đủ. –

5

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' 
Các vấn đề liên quan