2011-07-29 25 views
7

Tôi đã viết một trình điều khiển thiết bị char và bây giờ viết một QT "wrapper" mà một phần của nó là để có được một tín hiệu để cháy khi thiết bị trở nên dễ đọc thông qua cơ chế thăm dò ý kiến. Tôi đã cố gắng làm:Sử dụng QSocketNotifier để chọn trên thiết bị char.

QFile file("/dev/testDriver"); 
if(file.open(QFile::ReadOnly)) { 
    QSocketNotifier sn(file.handle(), , QSocketNotifier::Read); 
    sn.setEnabled(true); 
    connect(&sn, SIGNAL(activated(int)), &this, SLOT(readyRead())); 
} 

Nhưng readyRead chưa bao giờ được gọi và tài xế của tôi chưa bao giờ báo cáo có phương pháp thăm dò ý kiến.

tôi đã có thể để có được đoạn mã sau để làm việc vì vậy tôi biết lái xe của tôi đang làm việc

QFile file("/dev/testDriver"); 
if(file.open(QFile::ReadOnly)) { 
    struct pollfd fd; 
    fd.fd = file.handle(); 
    fd.events = POLLIN; 

    struct pollfd fds[] = {fd}; 
    int ready; 
    qDebug() << "Started poll"; 
    ready = poll(fds, 1, -1); 
    qDebug() << "Poll returned: " << ready; 

    QTextStream in(&file); 
    QTextStream out(stdout); 
    out << in.readAll(); 
} 

này đúng chờ tài xế của tôi để gọi wake_up và tôi có thể thấy hai cuộc thăm dò các cuộc gọi từ người lái xe của tôi. Một cho đăng ký thăm dò ý kiến ​​ban đầu và một cho khi wake_up xảy ra.

Làm theo cách này tôi có lẽ sẽ phải sinh ra một chuỗi riêng biệt mà tất cả nó đã làm là thăm dò ý kiến ​​trên thiết bị này và ném một tín hiệu và vòng lặp.

Có thể sử dụng QSocketNotifier theo cách này không? Các tài liệu của QFile::handle() dường như chỉ ra nó nên được.

+0

Bạn đã bao giờ làm việc này? Tôi đã viết một cái gì đó tương tự, nhưng tôi không thể nhận được 'file-> đọc (buf, 1)' để làm việc. Nó sẽ treo. Tuy nhiên, 'read (file-> handle(), buf, 1)' hoạt động tốt. – Harvey

+0

@Harvey Có câu trả lời tôi đã kiểm tra làm việc cho tôi. Hóa ra là một lỗi mã hóa đơn giản. Ngoài ra kiểm tra câu trả lời của tôi để xem nếu nó giúp bạn. – jjcf89

+0

Để sửa lại nhận xét trước đó của tôi, đó là một sự hiểu lầm về phần của tôi về cách thức hoạt động của trình điều khiển thiết bị. Cả hai đoạn mã đều hoạt động, nó chỉ xảy ra là các yếu tố khác của tôi đã khiến toàn bộ thử nghiệm thất bại khi tôi sử dụng một trong số chúng khiến tôi tạo ra kết nối sai. – Harvey

Trả lời

7

QSocketNotifer của bạn bị hủy ngay sau khi kết thúc chặn if. Nó không có cơ hội báo cáo bất cứ điều gì.

Bạn phải giữ cho trình thông báo ổ cắm đó còn sống miễn là bạn muốn tệp đó được giám sát. Cách đơn giản nhất để làm điều đó có lẽ là giữ một thành viên QSocketNotifer* ở một trong các lớp học của bạn.

+0

Cảm ơn mat. Đi con số nó có thể là một cái gì đó rất đơn giản. QSocketNotifier hoạt động tốt ngay bây giờ. – jjcf89

+0

Bạn có thể thêm QFile làm phụ huynh của QSocketNotifier và sau đó khi QFile bị xóa, như vậy là QSocketNotifier – RDP

13

Tôi cũng sẽ đề cập đến rằng QSocketNotifier có thể được sử dụng để xem stdin sử dụng sau

#include "ConsoleReader.h" 
#include <QTextStream> 

#include <unistd.h> //Provides STDIN_FILENO 

ConsoleReader::ConsoleReader(QObject *parent) : 
    QObject(parent), 
    notifier(STDIN_FILENO, QSocketNotifier::Read) 
{ 
    connect(&notifier, SIGNAL(activated(int)), this, SLOT(text())); 
} 

void ConsoleReader::text() 
{ 
    QTextStream qin(stdin); 
    QString line = qin.readLine(); 
    emit textReceived(line); 
} 

--- Tiêu đề

#pragma once 

#include <QObject> 
#include <QSocketNotifier> 

class ConsoleReader : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit ConsoleReader(QObject *parent = 0); 
signals: 
    void textReceived(QString message); 
public slots: 
    void text(); 
private: 
    QSocketNotifier notifier; 
}; 
+0

Cảm ơn bạn đã đọc một cách thanh lịch từ stdin. Tuy nhiên, imo có hai vấn đề: 1. std :: getline (std :: cin, line); nên được sử dụng thay cho QTextStream. Lý do là QTextStream sử dụng một số loại đệm, đó là vấn đề khi văn bản với \ n được dán vào thiết bị đầu cuối (một số văn bản sẽ bị mất). có thể một thành viên QTextStream cũng sẽ hoạt động. 2. sẽ tốt hơn nếu tạo trình thông báo trên heap với ConsoleReader làm cha mẹ. Bằng cách này, nó sẽ được chuyển sang một chuỗi mới cùng với ConsoleReader tự động nếu cần trong tương lai. Hãy nhớ rằng stdin không phải là chủ đề an toàn. – Adam

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