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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Вопрос пользователю изнутри QThread  (Прочитано 9322 раз)
IGHOR
Крякер
****
Offline Offline

Сообщений: 390



Просмотр профиля WWW
« : Апрель 02, 2010, 02:33 »

Пишу QThread в котором идет копирование файлов внутри функции run() и он передает по сигналу в прогресбар значения.
Поискав на форуме решение, понял что GUI можно создавать только в GUI потоке и общаться по сигналам и слотам и это работает безупречно.
Но мне нужно посредине обработки QDirIterator в функции run() спросить пользователя (Заменить,Пропустить,Отмена) через QMessageBox или любой виджет.
И незнаю как в таком случае использовать слоты и сигналы.
Подскажите что искать или как можно это правильно реализовать?
Записан
voronElf
Гость
« Ответ #1 : Апрель 02, 2010, 05:19 »

2 сигнала - один на запуск диалога, другой обратно в тред с результатом работы диалога. в промежутке между сигналами тред ждать должен.

ПС: треды не писал, можт какие подводные камешки есть у подхода ...
Записан
SASA
Гость
« Ответ #2 : Апрель 02, 2010, 10:12 »

На сколько я понял из моего общения со статическими функциями QMessageBox им вообще пофиг от куда запускаться.
Записан
voronElf
Гость
« Ответ #3 : Апрель 02, 2010, 10:15 »

даже из другого треда ?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Апрель 02, 2010, 11:39 »

Но мне нужно посредине обработки QDirIterator в функции run() спросить пользователя (Заменить,Пропустить,Отмена) через QMessageBox или любой виджет.
Нитка читающая файлы должна послать сигнал в главную. Коннект для этого сигнала должен быть создан с флагом BlockedQueuedConnection - вызывающий ждет ответа (пока диалог закроется). В главной - просто QMessageBox используя переданные слоту данные
Записан
IGHOR
Крякер
****
Offline Offline

Сообщений: 390



Просмотр профиля WWW
« Ответ #5 : Апрель 02, 2010, 11:49 »

SASA, нет не пофиг, из треда нормально не запускается.
Igors, передать меседжбоксу с флагом BlockedQueuedConnection для запуска вопроса это ясно, а как возвращать назад результат ответа в точку вызова?
voronElf, и как ждать посредине обработки QDirIterator?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Апрель 02, 2010, 12:26 »

Igors, передать меседжбоксу с флагом BlockedQueuedConnection для запуска вопроса это ясно, а как возвращать назад результат ответа в точку вызова?
В параметрах сигнала - указатель или ссылка. Если "Blocked.." то все происходит синхронно/последовательно, можно читать/писать без блокировок
Записан
IGHOR
Крякер
****
Offline Offline

Сообщений: 390



Просмотр профиля WWW
« Ответ #7 : Апрель 02, 2010, 17:40 »

Igors, на что именно указатель передавать в сигнале?
можно пример на пару строк?
Записан
SimpleSunny
Гость
« Ответ #8 : Апрель 02, 2010, 19:03 »

Если я правильно понял, то указатель на результат.

Код
C++ (Qt)
int result = 0;
emit userQuestion(&result);
switch (result)
{
...
}
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Апрель 02, 2010, 19:07 »

Igors, на что именно указатель передавать в сигнале?
можно пример на пару строк?
Можно на результат, на любую структуру - лишь бы существовало на момент вызова сигнала с "blocked" и было удалено после возврата из сигнала.
Записан
IGHOR
Крякер
****
Offline Offline

Сообщений: 390



Просмотр профиля WWW
« Ответ #10 : Апрель 02, 2010, 19:58 »

SimpleSunny, Igors спасибо за помощь
Записан
SASA
Гость
« Ответ #11 : Апрель 03, 2010, 14:50 »

SASA, нет не пофиг, из треда нормально не запускается.
Да, действительно не пофиг. Значит показалось. Плачущий
Записан
IGHOR
Крякер
****
Offline Offline

Сообщений: 390



Просмотр профиля WWW
« Ответ #12 : Апрель 04, 2010, 07:37 »

Делаю копирование файла так:
Код:
while(retry==1)
{
QFile::copy(copyFrom,copyTo);
if(!QFile::exists(copyTo))
  emit MessageBoxRetry(text,&retry);
else break;
}

Если файл не смог копироваться то выскакивает диалог с вопросом как и должно быть,
но если нажать Retry тогда после проверки диалог должен еще раз появиться но после ретрая в ответ получаю ошибку:
Код:
inline bool QObjectPrivate::isSignalConnected(uint signal_index) const
{
    return signal_index >= sizeof(connectedSignals) * 8
        || qt_signal_spy_callback_set.signal_begin_callback
        || qt_signal_spy_callback_set.signal_end_callback
        || (connectedSignals[signal_index >> 5] & (1 << (signal_index & 0x1f)));
            // в этой последней строке в файле qobject_p.h
}

Что дальше делать?

Ну а если файл копировался естественно окно диалога не появляется. Но оно всегда появляется, все пути в дебагере верны и файл существует, почему QFile::copy() не работает в треде?
« Последнее редактирование: Апрель 04, 2010, 07:40 от IGHOR » Записан
SimpleSunny
Гость
« Ответ #13 : Апрель 04, 2010, 08:19 »

А какой текст ошибки?

Не совсем понятно, файлы не копируются или копируются, но диалог все равно появляется? Если не копируются, то какую ошибку возвращает QFile?
QFile f(fileName).copy(newName); f.error();
Записан
IGHOR
Крякер
****
Offline Offline

Сообщений: 390



Просмотр профиля WWW
« Ответ #14 : Апрель 04, 2010, 18:00 »

SimpleSunny, все работает, я случайно путь перепутал, а проблема с повторным вызовом того же сигнала осталась
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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