Russian Qt Forum

Qt => Общие вопросы => Тема начата: QCasper от Декабрь 26, 2008, 10:52



Название: QFileSystemWatcher не реагирует на изменения в файле
Отправлено: QCasper от Декабрь 26, 2008, 10:52
Сабж проявляется на файле /proc/bus/usb/devices. Задача заключается в отслеживании подключения любого usb устройства. Этот файл совершенно точно изменяется при подключении упомянутых устройств. Проблема еще в том, что класс не располагает никакими средствами отладки (вроде lastError), и в консоль тоже никаких сообщений об ошибках не поступает. Поэтому понять в чем дело, достаточно тяжко. Может быть кто-нибудь сталкивался, или есть идеи... Ubuntu 8.10, Qt 4.4.3.


Название: Re: QFileSystemWatcher не реагирует на изменения в файле
Отправлено: lit-uriy от Декабрь 26, 2008, 11:03
а как пользуешь? код приведи.


Название: Re: QFileSystemWatcher не реагирует на изменения в файле
Отправлено: QCasper от Декабрь 26, 2008, 12:06
Код:
#include <QStringList>
#include <QCoreApplication>
#include <QFileSystemWatcher>

#include <QtDebug>

class Watcher : public QFileSystemWatcher {
Q_OBJECT
public:
Watcher() {
connect(this, SIGNAL(fileChanged(const QString &)),
SLOT(show(const QString &)));
}
private slots:
void show(const QString & path) { qDebug() << path; }
};

int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);

Watcher w;
w.addPath("/proc/bus/usb/device");

return a.exec();
}

#include "moc_main.cpp"


Название: Re: QFileSystemWatcher не реагирует на изменения в файле
Отправлено: BRE от Декабрь 26, 2008, 12:34
Так может лучше с Hal'ом "задружить".
Код
C++ (Qt)
DeviceManager::DeviceManager( QObject *parent )
: QObject( parent ), m_deviceScaner( new DeviceScaner( this ) )
{
 
   // Подключаемся к сервисам Hal
   if( !QDBusConnection::systemBus().connect( "org.freedesktop.Hal",
       "/org/freedesktop/Hal/Manager", "org.freedesktop.Hal.Manager",
       "DeviceAdded", this, SLOT( halDeviceAdded( const QString & ) ) ) )
qWarning() << "Error connection signal DeviceAdded";
 
   if( !QDBusConnection::systemBus().connect( "org.freedesktop.Hal",
       "/org/freedesktop/Hal/Manager", "org.freedesktop.Hal.Manager",
       "DeviceRemoved", this, SLOT( halDeviceRemoved( const QString & ) ) ) )
qWarning() << "Error connection signal DeviceRemoved";
}
 
void DeviceManager::halDeviceAdded( const QString &udi )
{
qWarning() << "Added : " << udi;
}
 
void DeviceManager::halDeviceRemoved( const QString &udi )
{
qWarning() << "Removed : " << udi;
}
 

Код
C++ (Qt)
int main( int argc, char *argv[] )
{
Q_INIT_RESOURCE( demon );
 
QApplication app( argc, argv );
 
if( !QDBusConnection::systemBus().isConnected() )
{
qWarning() << "Cannot connect to the D-BUS session bus.";
return 1;
}
 
MainWindow *mw = new MainWindow;
mw->show();
 
return app.exec();
}
 


Название: Re: QFileSystemWatcher не реагирует на изменения в файле
Отправлено: QCasper от Декабрь 26, 2008, 13:37
Так может лучше с Hal'ом "задружить".

Я бы сказал, не "может", а совершенно точно лучше и правильнее. Просто я не знал как делать через хал. Спасибо.
Я бы еще хотел уточнить, если можно, как расшифровать строку "/org/freedesktop/Hal/devices/usb_device_125f_1017_0db6b7e5fda697", а именно её последнюю часть (usb_device_...). То есть какую инфу оттуда можно получить, типа vendor id, product id и прочего?


Название: Re: QFileSystemWatcher не реагирует на изменения в файле
Отправлено: BRE от Декабрь 26, 2008, 13:39
Я бы сказал, не "может", а совершенно точно лучше и правильнее. Просто я не знал как делать через хал. Спасибо.
Я бы еще хотел уточнить, если можно, как расшифровать строку "/org/freedesktop/Hal/devices/usb_device_125f_1017_0db6b7e5fda697", а именно её последнюю часть (usb_device_...). То есть какую инфу оттуда можно получить, типа vendor id, product id и прочего?
А это нужно делать через интерфейс Hal к этому устройству. Там ты получишь всю нужную (и не нужную) информацию.
Запусти qdbusviewer и все увидишь.  ;)


Название: Re: QFileSystemWatcher не реагирует на изменения в файле
Отправлено: BRE от Декабрь 26, 2008, 13:44
Подключение к интерфейсу:
Код
C++ (Qt)
QDBusInterface iDev( "org.freedesktop.Hal", udi, "org.freedesktop.Hal.Device", QDBusConnection::systemBus() );
if( !iDev.isValid() )
return QString();
 
QDBusReply<QString> category = iDev.call( "GetPropertyString", "info.category" );
 


Название: Re: QFileSystemWatcher не реагирует на изменения в файле
Отправлено: QCasper от Декабрь 26, 2008, 14:04
Подключение к интерфейсу:
Код
C++ (Qt)
QDBusReply<QString> category = iDev.call( "GetPropertyString", "info.category" );
 

Вот кстати, да, я там во вьювере смотрю эти методы GetProperty и GetPropertyString, но непонятно откуда узнать про параметры, с которыми их нужно вызывать. Вот например "info.category" откуда стал известен?


Название: Re: QFileSystemWatcher не реагирует на изменения в файле
Отправлено: BRE от Декабрь 26, 2008, 14:09
Вот кстати, да, я там во вьювере смотрю эти методы GetProperty и GetPropertyString, но непонятно откуда узнать про параметры, с которыми их нужно вызывать. Вот например "info.category" откуда стал известен?
Из документации к Hal.
Запусти hal-device.


Название: Re: QFileSystemWatcher не реагирует на изменения в файле
Отправлено: BRE от Декабрь 26, 2008, 14:17
Последняя спецификация.
http://people.freedesktop.org/~david/hal-spec/hal-spec.html (http://people.freedesktop.org/~david/hal-spec/hal-spec.html)


Название: Re: QFileSystemWatcher не реагирует на изменения в файле
Отправлено: QCasper от Декабрь 26, 2008, 14:50
Блин, странная фигня, на все свойства которые я пробую (вставляю прямо из доки), получаю один и тот же ответ:

Цитировать
QDBusMessage(type=Error, service="", error name="org.freedesktop.Hal.NoSuchProperty", error message="No property usb_device.vendor on device with id /org/freedesktop/Hal/devices/usb_device_1d6b_1_0000_00_1d_0_3_if0_0", signature="", contents=((unknown)) )

Ну, вместо "usb_device.vendor" каждый раз соответствующее.


Название: Re: QFileSystemWatcher не реагирует на изменения в файле
Отправлено: QCasper от Декабрь 26, 2008, 15:02
Всё, разобрался. Вроде работает, всё что нужно.
BRE, большое спасибо.