2009-09-02 24 views
5

Lời xin lỗi của tôi cho một tiêu đề không chính xác, nhưng tôi không chắc chắn điều này được gọi chính xác.In trên bảng điều khiển mà không bị ngập trong C++

Làm cách nào để in một bảng điều khiển, một dòng cập nhật?

Ví dụ: nếu tôi muốn in trạng thái hoàn thành phần trăm mỗi chu kỳ nhưng không làm ngập bảng điều khiển bằng hơi nước của văn bản, tôi sẽ làm điều này như thế nào? (Cái này gọi là gì? - đối với Googling trong tương lai)

Cảm ơn bạn!

Trả lời

11

Không có cách di động để làm sạch màn hình mặc dù có một cách đơn giản để quay lại đầu dòng sử dụng \r rồi ghi đè lên những gì chúng tôi đã viết trước đây. Tôi đang sử dụng Sleep từ Windows API:

#include <iostream> 
#include <windows.h> 
using namespace std; 

int main() 
{ 
for(int i = 1; i <= 10; i++) 
{ 
    std::cout << i*10 << '%'; 
    std::cout.flush(); // see wintermute's comment 
    Sleep(1000); 
    std::cout << '\r'; 
} 
} 
+0

Để chiếu sáng xa hơn, '\ r' sẽ trả về kết quả vận chuyển. –

+6

Bạn có thể muốn gọi 'std :: cout.flush()' trước 'Sleep()' vì 'std :: cout' là một luồng đệm và do đó nội dung của nó có thể không được hiển thị khi bạn mong đợi. –

+1

Như Dan nói, '\ r' là một vận chuyển trở lại, mà không * rõ ràng * dòng, nó chỉ di chuyển con trỏ trở lại đầu dòng. –

2

Các giải pháp cơ bản là:

loop: 
    backspace (over written text) 
    write (without newline) 
    flush 
    wait and get updates 

Ngoài ra, bạn có thể thử một giải pháp sử dụng thư viện lời nguyền - mặc dù tôi không chắc chắn cho dù đây là khá gì bạn đang theo đuổi. Curses cung cấp đồ họa ascii cơ bản của bạn cho các GUI dựa trên văn bản (đôi khi được gọi là TUI).

+0

Lời nguyền là cách duy nhất để thực hiện cổng này một cách ably. Lưu ý nó giả định giao diện điều khiển của bạn là một phần của DB lời nguyền. –

3

Ví dụ là cách duy nhất để thực hiện điều này một cách hợp lý.

Hãy xem điều này: http://code.google.com/p/tinycurses/wiki/basic1

+2

Tôi sẽ không nói cách "duy nhất". Nếu thiết bị đầu cuối tương thích với ANSI, bạn có thể xuất ra "\ r" hoặc '\ 015'. Nếu nó tương thích với VT-100, bạn cũng có thể xuất '\ 033 [5n' sang TTY và đáp ứng sẽ nằm dọc theo các dòng '\ 033 [5; 5R' và sau đó bạn có thể gửi '\ 033 [5; 0H 'để đi đến đầu dòng 5. Đó là tất cả ncurses nào anyway. – greyfade

+0

Cách ** di động ** duy nhất. Bởi vì các phương pháp chữa trị tóm tắt thiết bị đầu cuối, do đó bạn không cần phải biết một thiết bị VT-100 tương thích hoặc bất kỳ thứ gì khác. Bạn có thể làm những gì bạn mô tả trong chỉ là về bất kỳ thiết bị đầu cuối bạn chỉ cần phải digg thông qua các tài liệu và hiểu nó. Đó là lý do tại sao chúng tôi đã nguyền rủa nó ** ABSTRACTS ** các thiết bị đầu cuối, do đó bạn không cần phải biết, do đó là chỉ ** PORTABLE ** cách. OK có các thư viện khác (như ncurses). O yea chỉ nhớ ncurses chỉ là lời nguyền nhưng một phiên bản mới :-) –

0

Chu kỳ của bạn nhanh như thế nào? Chúng có trong mili giây hay không. Nếu chu kỳ của bạn ngắn, bạn chỉ có thể muốn cập nhật màn hình sau một giây như được bật lên.

Ví dụ

include <time.h> /* if memory serves me correctly */ 
    int currentTime = time(0); 
    for (int i = 0; i < 100; i++) 
    { 
    /* do work here and save the percentage completed */ 
    lastTime = time(0); 
    if ((lastTime-currentTime) >= 1) 
    { 
     /* output percentage completed (using AraK information) */ 
     currentTime = lastTime; 
    } 
    } 

này sẽ chỉ cập nhật màn hình mỗi giây và tiết kiệm thời gian bằng văn bản cho màn hình vì nó tiêu thụ thời gian để vẽ lại màn hình (mà bạn có thể sử dụng để chế biến). Ngoài ra, nếu cập nhật của bạn diễn ra quá nhanh, điều này cho phép người dùng thấy tỷ lệ phần trăm nếu chu kỳ của bạn khá ngắn, vì bạn có thể vẽ lại màn hình mọi lúc.

Lưu ý: Được cập nhật dựa trên nhận xét.

+0

Cần phải có thời gian (0). time() lấy địa chỉ của một time_t, cập nhật time_t được tham chiếu nếu được đưa ra. –

+2

Hoặc bạn chỉ có thể cập nhật khi tỷ lệ phần trăm thực sự tăng, không có điểm cập nhật nếu điều tương tự sẽ được hiển thị và với số lượng cuộc gọi vẽ không quá 101 (giả sử hiển thị 0% -> 100%) , bản vẽ sẽ không ảnh hưởng nhiều đến hiệu suất –

+0

Cảm ơn bạn đã nhập. Đã một thời gian kể từ khi tôi đã sử dụng chức năng thời gian. – Glenn

0

Điều này tùy thuộc vào nền tảng bạn đang sử dụng. Tôi không chắc chắn cách bạn làm điều này trên Linux, nhưng trên Windows, bạn có thể sử dụng WriteConsole hoặc SetConsoleCursorPosition để thực hiện việc này.

Tôi không tin rằng một cách hoàn toàn di động để thực hiện điều này tồn tại ngoài việc xuất ra hàng tấn không gian sau như đã đề cập. Phương pháp backspace có thể gây ra nhiều nhấp nháy có thể không được chấp nhận trong ứng dụng của bạn ... các chức năng Win32 không gây nhấp nháy. Không chắc về thư viện nguyền rủa.

Các vấn đề liên quan