Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прогресс копирования(сигнал QFile - bytesWritten), не срабатывает 
V
    Опции темы
franzR
Дата 23.2.2011, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.10.2009

Репутация: нет
Всего: нет



Qt 4.7.0, QtCreator 2.0.1, Win XP SP3 (32bit)

Ребят, тут такое дело. 
Не могу понять почему не срабатывает сигнал при копировании. В консоль ничего не пишет. Полазил по инету не смог разрулить, обращаюсь к вам.
Копирование само происходит, а вот прогресс бар не мычит и не телится...

Собственно класс:

.h

Код

#ifndef COPYTHREAD_H
#define COPYTHREAD_H

#include <QThread>
#include <QFile>

class CopyThread : public QThread
{
    Q_OBJECT

public:
    int written;
    void setVariables(QString Ifile, QString Idest);

    void run();
    QFile destCpy;
    QFile fileCpy;
    CopyThread();


private:
    QString file;
    QString dest;



signals:
    void finished();
    void percent(int);
    void report(QString text);

public slots:
    void progres(qint64);
};

#endif // COPYTHREAD_H




.cpp
Код

#include "copythread.h"

CopyThread::CopyThread()
{
}

void CopyThread::progres(qint64 p)
{
   written = p / 1024;
   emit percent(written);
}

void CopyThread::setVariables(QString Ifile, QString Idest)
{
    file = Ifile;
    dest = Idest;
}

void CopyThread::run()
{

    destCpy.setFileName(dest);
    fileCpy.setFileName(file);

    written = 0;

    connect(&fileCpy, SIGNAL(bytesWritten(qint64)), SLOT(progres(qint64)));

    if(fileCpy.copy(destCpy.fileName())){
        emit report("File was copied.");
    }else{
        emit report("ERROR: file wasn't copied!");
    }
}


Запускаю поток так:

Код

thread.setVariables(copyFrom, copyTo);

thread.start();


Ставлю брекпоинт на:
Код

   written = p / 1024;


На место останова никогда не попадаю, значит и emit который далее по тексту не происходит. 

Подскажите что не так сделал... smile 


PM MAIL   Вверх
bsa
Дата 23.2.2011, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



думаю, не будет работать, так как в потоке копирования нет цикла обработки событий (EventLoop).

Это сообщение отредактировал(а) bsa - 23.2.2011, 20:22
PM   Вверх
alexvs11
Дата 23.2.2011, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: 2
Всего: 10



для копирования не обязательно новый поток, можно и в один поток с модальным QProgressBar
PM MAIL   Вверх
Modul
Дата 23.2.2011, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 17.2.2006

Репутация: нет
Всего: нет



Цитата(franzR @  23.2.2011,  16:28 Найти цитируемый пост)
а вот прогресс бар не мычит и не телится...


А как он у Вас реализован в консоли ? Простите, спросил...
--------------------
I'll be back !
PM MAIL   Вверх
borisbn
Дата 24.2.2011, 03:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



а ты уверен, что ф-ция copy вообще должна выдавать сигнал bytesWritten ?
если реализуешь copy вручную: read из одного, write в другой, то м.б. и будет вызываться


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
franzR
Дата 24.2.2011, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.10.2009

Репутация: нет
Всего: нет



Спасибо всем что не остались равнодушными к вопросу! smile 

bsa:
Цитата

думаю, не будет работать, так как в потоке копирования нет цикла обработки событий (EventLoop).

Логично, согласен!

alexvs11:
Цитата

для копирования не обязательно новый поток, можно и в один поток с модальным QProgressBar

это хорошо, но у мну прогресс бар на форме, и хотелось бы его юзать не просто показав что скопировался какой то файл, а вот если он большой то прям весь процесс копирования.

borisbn:
Цитата

а ты уверен, что ф-ция copy вообще должна выдавать сигнал bytesWritten ?
если реализуешь copy вручную: read из одного, write в другой, то м.б. и будет вызываться

Да тут вы совершенно правы QFile не имеет такого сигнала по документации! Хотя при connect выдает в списке доступные сигналы и среди них есть bytesWritten. Странно что при connect не ругается...

borisbn, bsa - спасибо, натолкнули на мысль, буду развивать.
PM MAIL   Вверх
borisbn
Дата 24.2.2011, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(franzR @  24.2.2011,  15:22 Найти цитируемый пост)
QFile не имеет такого сигнала по документации!

имеет, т.к. он унаследован от QIODevice, в котором этот сигнал и объявлен
Цитата(franzR @  24.2.2011,  15:22 Найти цитируемый пост)
Странно что при connect не ругается...

потому и не ругается, что всё ОК.

всё-таки попробуй вручную
Цитата(borisbn @  24.2.2011,  03:08 Найти цитируемый пост)
read из одного, write в другой




--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
franzR
Дата 28.2.2011, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.10.2009

Репутация: нет
Всего: нет



Долго молчал, извиняюсь, подгрузили работой, не было времени разбираться.

Реализовал копирование таким образом:
Код

    qint64 nCopySize = QFileInfo(fileCpy).size();
    qint64 size = 0;
    if(destCpy.exists())
    {
        destCpy.remove();
    }
    if(!destCpy.open(QIODevice::ReadWrite))
    {
        emit report("Can't create file");
    }
    if(!fileCpy.open(QIODevice::ReadOnly))
    {
        emit report("Can't read file");
    }
    while(nCopySize > size)
    {
        if(destCpy.write(fileCpy.read(size)))
        {
            emit report(QString::number(size/divider));
        }
        destCpy.seek(size);
        fileCpy.seek(size);
        size += divider;
        emit percent(size/divider);

    }
    if(nCopySize < size){
        size = size - nCopySize;
        destCpy.write(fileCpy.read(size));
        destCpy.close();
    }else{
        destCpy.close();
    }
    fileCpy.close();



divider - приходит из класса кот. запускает на копирование поток, зависит от размера копируемого файла.

Метод работает медленно до ужаса! С большими файлами жрет оперативу просто капец! Как бы его так оптимизировать чтоб копировалось не хуже чем в Total Comander например или винде?
Там копирование отображает и прогресс, и быстро работает без кушания оперативы...

PM MAIL   Вверх
borisbn
Дата 28.2.2011, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Для Windows лучше всего использовать winAPI, а именно CopyFileEx
сделать на Qt так же быстро, как в винде и кроссплатформенно, скорее всего не получится.
Если нужно на ОС, отличных от винды - думаю стОит смотреть их API


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
franzR
Дата 2.3.2011, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 12.10.2009

Репутация: нет
Всего: нет



Раз более предложений по копированию нет, то тему можно считать закрытой.

Еще раз спасибо всем кто откликнулся, особенно borisbn!

Это сообщение отредактировал(а) franzR - 2.3.2011, 11:09
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1091 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.