Russian Qt Forum
Сентябрь 29, 2024, 02:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QFileSystemWatcher не реагирует на изменения в файле  (Прочитано 7928 раз)
QCasper
Гость
« : Декабрь 26, 2008, 10:52 »

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

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Декабрь 26, 2008, 11:03 »

а как пользуешь? код приведи.
Записан

Юра.
QCasper
Гость
« Ответ #2 : Декабрь 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"
Записан
BRE
Гость
« Ответ #3 : Декабрь 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();
}
 
« Последнее редактирование: Декабрь 26, 2008, 12:46 от BRE » Записан
QCasper
Гость
« Ответ #4 : Декабрь 26, 2008, 13:37 »

Так может лучше с Hal'ом "задружить".

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

Я бы сказал, не "может", а совершенно точно лучше и правильнее. Просто я не знал как делать через хал. Спасибо.
Я бы еще хотел уточнить, если можно, как расшифровать строку "/org/freedesktop/Hal/devices/usb_device_125f_1017_0db6b7e5fda697", а именно её последнюю часть (usb_device_...). То есть какую инфу оттуда можно получить, типа vendor id, product id и прочего?
А это нужно делать через интерфейс Hal к этому устройству. Там ты получишь всю нужную (и не нужную) информацию.
Запусти qdbusviewer и все увидишь.  Подмигивающий
Записан
BRE
Гость
« Ответ #6 : Декабрь 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" );
 
Записан
QCasper
Гость
« Ответ #7 : Декабрь 26, 2008, 14:04 »

Подключение к интерфейсу:
Код
C++ (Qt)
QDBusReply<QString> category = iDev.call( "GetPropertyString", "info.category" );
 

Вот кстати, да, я там во вьювере смотрю эти методы GetProperty и GetPropertyString, но непонятно откуда узнать про параметры, с которыми их нужно вызывать. Вот например "info.category" откуда стал известен?
Записан
BRE
Гость
« Ответ #8 : Декабрь 26, 2008, 14:09 »

Вот кстати, да, я там во вьювере смотрю эти методы GetProperty и GetPropertyString, но непонятно откуда узнать про параметры, с которыми их нужно вызывать. Вот например "info.category" откуда стал известен?
Из документации к Hal.
Запусти hal-device.
Записан
BRE
Гость
« Ответ #9 : Декабрь 26, 2008, 14:17 »

Последняя спецификация.
http://people.freedesktop.org/~david/hal-spec/hal-spec.html
Записан
QCasper
Гость
« Ответ #10 : Декабрь 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" каждый раз соответствующее.
Записан
QCasper
Гость
« Ответ #11 : Декабрь 26, 2008, 15:02 »

Всё, разобрался. Вроде работает, всё что нужно.
BRE, большое спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.123 секунд. Запросов: 23.