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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QThread, progressBar...  (Прочитано 14360 раз)
Zmey
Гость
« : Июнь 18, 2004, 13:51 »

Windows XP
Qt-Win-Commercial-3.2.1
Visual C++ 6

Пишу программу, которая копирует большой файл, для отображения процесса копирования использую прогресс бар (QProgressBar).Копирую так:
Код:

int cancel=false;
bool copyok=CopyFileEx(sFromPath,// name of existing file
sToPath,// name of new file
MyCopyProgressRoutine,// callback function
progressBar,// callback parameter
&cancel,// cancel status
NULL);// copy options

MyCopyProgressRoutine, это:
Код:

DWORD CALLBACK MyCopyProgressRoutine(
LARGE_INTEGER TotalFileSize, // total file size, in bytes
LARGE_INTEGER TotalBytesTransferred, // total number of bytes transferred
LARGE_INTEGER StreamSize, // total number of bytes for this stream
LARGE_INTEGER StreamBytesTransferred, // total number of bytes transferred for this stream
DWORD dwStreamNumber, // the current stream
DWORD dwCallbackReason, // reason for callback
HANDLE hSourceFile, // handle to the source file
HANDLE hDestinationFile, // handle to the destination file
LPVOID lpData // passed by CopyFileEx
)
{
QProgressBar *ukaz = (QProgressBar *) lpData;
double TBT=TotalBytesTransferred.QuadPart;
double TFS=TotalFileSize.QuadPart;
double delen=TBT/TFS*100;
ukaz->setProgress((int)delen);
return PROGRESS_CONTINUE;
}

Когда копируется файл, замирает окно программы, невозможно его переместить и т.д. И если пытаться окошко передвинуть, оно через несколько секунд передвигается  , но прогрессбар замирает, и оживает только тогда, когда файл скопируется, тогда прогрессбар становится в 100%. Тогда делаем копирование в отдельном потоке:
Код:

class MyThread : public QThread
{
public:
virtual void run();
};

void MyThread::run()
{
int cancel=false;
bool copyok=CopyFileEx(...);
}

Но это не помогает! И самая лажа, что я смотрю в TaskInfi2003 (прога, показывающая процессы), и она не показывает, что у моей проги появился новый поток. Можете что-нибудь подсказать?
Записан
Rainbow
Гость
« Ответ #1 : Июнь 18, 2004, 14:08 »

А как запускаеш поток?
Записан
Zmey
Гость
« Ответ #2 : Июнь 18, 2004, 15:03 »

Цитата: "Rainbow"
А как запускаеш поток?


   MyThread w;
   w.run();
   w.wait();
Записан
Zmey
Гость
« Ответ #3 : Июнь 18, 2004, 15:15 »

Ответил, а потом думаю, а причем тут w.run(); ?
Исправил на w.start();
Теперь видно, что поток запускается, загружает процессор, то есть копирование идет через него, но проблема не решилась: окно сначала ни на что не реагирует, прогрессбар бежит, а потом окно оживает но замораживается прогрессбар, то есть так как было.
Записан
EugeneVC
Гость
« Ответ #4 : Июнь 18, 2004, 16:54 »

так в чем у тебя проблемма то
окно морозится?
Записан
Anonymous
Гость
« Ответ #5 : Июнь 21, 2004, 08:32 »

Цитата: "EugeneVC"
так в чем у тебя проблемма то
окно морозится?

Когда начинается копирование - окно морозится, его нельзя переместить, не нажимаются кнопки, но прогрессбар бежит. Через секунд десять окошко можно переместить, но кнопки все еще заморожены. И если окошко не трогать, то он прогресс благополучно добегает до 100%, но если окошко тронуть, морозится и прогресс Улыбающийся и не оживает пока файл не докопируется. Вот такой отстой.
Записан
EugeneVC
Гость
« Ответ #6 : Июнь 21, 2004, 14:14 »

можно попробовать вызывать
qApp->processEvents ();

это позволит избежать заморозки окон
Записан
Zmey
Гость
« Ответ #7 : Июнь 22, 2004, 10:45 »

Большое спасибо.
Кстати, хорошая книга http://hardclub.donntu.edu.ua/projects/qt/books/QT3%20GUI%20Programming.zip. В ней есть такая глава "Staying Responsive During Intensive Processing", описывается как сделать, чтобы не морозилось окно.
Записан
Zmey
Гость
« Ответ #8 : Октябрь 25, 2004, 11:55 »

Трабл с потоками решился так: MyThread w; запускаем поток не  w.start(); , а w.start(QThread::HighestPriority);
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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