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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Форма перестает отрисовывать  (Прочитано 4690 раз)
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 Я очень благодарен тем, кто тратит свое время и помогает новичкам
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4746



Просмотр профиля WWW
« Ответ #1 : Декабрь 06, 2012, 14:32 »

вставь qApp->processEvents() в бесконечный цикл. но думаю лучше воспользоваться QFileSystemWatcher.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
qwyllum
Гость
« Ответ #2 : Декабрь 06, 2012, 14:40 »

вставь qApp->processEvents() в бесконечный цикл. но думаю лучше воспользоваться QFileSystemWatcher.

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

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #3 : Декабрь 06, 2012, 14:49 »

ага, и пошлет сигнал если произошли изменения с файлом или дирректорией.
Записан
Bepec
Гость
« Ответ #4 : Декабрь 06, 2012, 15:02 »

QFileSystemWather в версиях 4.7 (точно. В 5.0 незнаю) не даёт сигнала при изменении нутрей файла. Только удаление/перемещение. Возможно и копирование, но не пробовал.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Декабрь 06, 2012, 16:56 »

Как мне получить доступ к приложению из методов диалога? Пробовал передавать переменную класса QApplication в конструкторе по ссылке , но ругается на то, что не указан параметр по умолчанию. А ссылку можно один раз инициализировать в принципе, если я не ошибаюсь. Как быть, подскажите пожалуйста?
Вы задали пожалуй самый популярный вопрос Улыбающийся По существу он равен вопросу "а как программировать?". Возможна масса общих ответов но толку с них маловато. Поэтому приведите конкретный пример - зачем Вашему диалогу понадобилось лезть в данные приложения. Тогда и ответы могут быть более конкретны/полезны

Edit: запостил и увидел что вопроса уже нет - ну это к лучшему  Улыбающийся
« Последнее редактирование: Декабрь 06, 2012, 16:59 от Igors » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4746



Просмотр профиля WWW
« Ответ #6 : Декабрь 14, 2012, 01:07 »

QFileSystemWather в версиях 4.7 (точно. В 5.0 незнаю) не даёт сигнала при изменении нутрей файла.
в 4.8.3 сигнал срабатывает
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Bepec
Гость
« Ответ #7 : Декабрь 14, 2012, 07:07 »

Значит исправили ) Но для 4.7.2 надо опасаться Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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