2012-03-16 10 views
9

Tôi muốn đọc không đồng bộ từ stdin với Qt. Tôi không muốn sử dụng một thread riêng biệt hoặc phải thiết lập một bộ định thời để định kỳ kiểm tra xem bộ mô tả tập tin có dữ liệu hay không. Tôi có thể làm cái này như thế nào?Đọc không đồng bộ từ stdin với Qt

+0

Có gì sai khi sử dụng một chuỗi hoặc bỏ phiếu? – Chris

+0

Không muốn lãng phí tài nguyên trên các sợi chỉ và phải đối phó với khóa không nếu tôi có thể tránh nó. Tôi cũng không muốn lãng phí chu kỳ CPU khi ứng dụng của tôi không hoạt động. – megazord

+2

Âm thanh với tôi như bạn đang cố gắng tối ưu hóa mã của mình trước khi xem có thực sự cần hay không. Tôi muốn nói cách tiếp cận thread có lẽ là quá phức tạp, nhưng bỏ phiếu định kỳ với một bộ đếm thời gian là khá dang rẻ. – Chris

Trả lời

3

Nếu bạn đọc tài liệu Qt, nó cho biết bạn không thể làm điều này vì nó không di động. Tại sao không sử dụng một ổ cắm TCP nên làm việc giả sử bạn có quyền kiểm soát đầu kia. Trường hợp xấu nhất bạn có thể tạo một ứng dụng proxy.

1

Như Chris đã chỉ ra cách tốt nhất là có một chuỗi riêng biệt có thể thăm dò ý kiến ​​từ stdin và điền dữ liệu cho chuỗi hiển thị hoặc xử lý để xử lý.

Bây giờ bạn chắc chắn có thể thiết lập QTimer và thiết lập trình xử lý tín hiệu timeout() để đọc từ stdin. Phương pháp triển khai hoàn toàn tùy thuộc vào bạn.

Và đối với phương pháp thứ hai, bạn có thể xem QT's timer class documentation để biết ví dụ về cách thực hiện việc này. Một điều cần nhớ là thực sự khởi động lại bộ hẹn giờ khi quá trình xử lý của bạn hoàn tất.

+0

Điều này nghe có vẻ như là một ý tưởng hay cho đến khi bạn nhìn vào tác động của thời lượng pin cho điện thoại di động và máy tính xách tay. Chưa kể bạn giới thiệu độ trễ nhân tạo khiến ứng dụng của bạn có vẻ chậm chạp. –

+0

@ericdescourtis Với câu trả lời này là hơn 5 tuổi, có nhiều lựa chọn tốt hơn bây giờ. – Karlson

+0

? Degnahc sah yltcaxe tahw ot sa su nethgilne uoy dluoC! TaerG –

2

Nếu bạn đang mở để sử dụng tăng, bạn có thể sử dụng thư viện Asio. A posix::stream_descriptor được gán cho STDIN_FILENO hoạt động khá tốt. Xem thêm this answer.

1

Hãy thử sử dụng QSocketNotifier

QSocketNotifier * notifier = new QSocketNotifier(FDSTDIN, QSocketNotifier::Read); 
connect(notifier, SIGNAL(activated(int)), this, SLOT(readStdin(int))); 
+0

Bạn đã thử chưa? Nó có thực sự hoạt động không? – megazord

+0

Tôi đã không thử nó, tìm thấy giải pháp này somwhere –

+1

Tôi đã thử. Không may là nó không: ((http://pastebin.com/8yWyMmsx – borisbn