Russian Qt Forum

Qt => Вопросы новичков => Тема начата: qwyllum от Декабрь 06, 2012, 13:58



Название: Форма перестает отрисовывать
Отправлено: qwyllum от Декабрь 06, 2012, 13:58
Доброго времени уважаемые форумчане) Буду очень признателен, если кто-нибудь объяснит мне, в чем суть проблемы. Нашел исходник программы, которая отслеживает обращения к выбранному файлу. Исходник консольный. Переделал его для QT сперва заменив printf на qDebug() - все отлично работает. Однако мне нужен GUI - поэтому, заменил дебаг на listwidget.InsertItem(). Как только программа начинает отслеживать изменения файла, форма зависает и перестает отрисовываться и реагировать на нажатия. Посколько qDebug нормально работает, я сделал вывод, что просот не до конца понимаю специфику работы GUI приложений. Подскажите пожалуйста, где я упустил что.

Выкладываю код, при котором GUI зависает:

Код:
void Dialog::on_pushButton_clicked()
{
      char *tar2="/home/eugenes/111";
       char target[FILENAME_MAX];
            int fd;
       int wd;   /* watch descriptor */


       ui->listWidget->insertItem(0, QString("!!!Watching"));
          strcpy (target, tar2);
       fd = inotify_init();
       wd = inotify_add_watch (fd, target, IN_ALL_EVENTS);
       fd = inotify_init();

       while (1) {
          get_event(fd, target);
       }

}

void Dialog::get_event (int fd, const char * target)
{
    ssize_t len, i = 0;
    char action[81+FILENAME_MAX] = {0};
    char buff[BUFF_SIZE] = {0};

    len = read (fd, buff, BUFF_SIZE);

    while (i < len) {
       struct inotify_event *pevent = (struct inotify_event *)&buff[i];
       char action[81+FILENAME_MAX] = {0};

       if (pevent->len)
          strcpy (action, pevent->name);
       else
          strcpy (action, target);

       if (pevent->mask & IN_ACCESS)
          strcat(action, " was read");
       if (pevent->mask & IN_ATTRIB)
          strcat(action, " Metadata changed");
       if (pevent->mask & IN_CLOSE_WRITE)
          strcat(action, " opened for writing was closed");
       if (pevent->mask & IN_CLOSE_NOWRITE)
          strcat(action, " not opened for writing was closed");
       if (pevent->mask & IN_CREATE)
          strcat(action, " created in watched directory");

       if (pevent->mask & IN_MODIFY)
          strcat(action, " was modified");
       if (pevent->mask & IN_OPEN)
          strcat(action, " was opened");


       if (pevent->len) printf ("name=%s\n", pevent->name);


       ui->listWidget->insertItem(0, QString(action));

       i += sizeof(struct inotify_event) + pevent->len;

    }

}  /* get_event */


PS Я очень благодарен тем, кто тратит свое время и помогает новичкам


Название: Re: Форма перестает отрисовывать
Отправлено: kambala от Декабрь 06, 2012, 14:32
вставь qApp->processEvents() в бесконечный цикл. но думаю лучше воспользоваться QFileSystemWatcher.


Название: Re: Форма перестает отрисовывать
Отправлено: qwyllum от Декабрь 06, 2012, 14:40
вставь qApp->processEvents() в бесконечный цикл. но думаю лучше воспользоваться QFileSystemWatcher.

Простите, QFileSystemWatcher выполняет ту же функцию, что и inotify? т.е. Может сказать, происходят ли какие-то действия над указанным файлом?


Название: Re: Форма перестает отрисовывать
Отправлено: ecspertiza от Декабрь 06, 2012, 14:49
ага, и пошлет сигнал если произошли изменения с файлом или дирректорией.


Название: Re: Форма перестает отрисовывать
Отправлено: Bepec от Декабрь 06, 2012, 15:02
QFileSystemWather в версиях 4.7 (точно. В 5.0 незнаю) не даёт сигнала при изменении нутрей файла. Только удаление/перемещение. Возможно и копирование, но не пробовал.


Название: Re: Форма перестает отрисовывать
Отправлено: Igors от Декабрь 06, 2012, 16:56
Как мне получить доступ к приложению из методов диалога? Пробовал передавать переменную класса QApplication в конструкторе по ссылке , но ругается на то, что не указан параметр по умолчанию. А ссылку можно один раз инициализировать в принципе, если я не ошибаюсь. Как быть, подскажите пожалуйста?
Вы задали пожалуй самый популярный вопрос :) По существу он равен вопросу "а как программировать?". Возможна масса общих ответов но толку с них маловато. Поэтому приведите конкретный пример - зачем Вашему диалогу понадобилось лезть в данные приложения. Тогда и ответы могут быть более конкретны/полезны

Edit: запостил и увидел что вопроса уже нет - ну это к лучшему  :)


Название: Re: Форма перестает отрисовывать
Отправлено: kambala от Декабрь 14, 2012, 01:07
QFileSystemWather в версиях 4.7 (точно. В 5.0 незнаю) не даёт сигнала при изменении нутрей файла.
в 4.8.3 сигнал срабатывает


Название: Re: Форма перестает отрисовывать
Отправлено: Bepec от Декабрь 14, 2012, 07:07
Значит исправили ) Но для 4.7.2 надо опасаться :)