Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Zmey от Июнь 18, 2004, 13:51



Название: QThread, progressBar...
Отправлено: 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 (прога, показывающая процессы), и она не показывает, что у моей проги появился новый поток. Можете что-нибудь подсказать?


Название: QThread, progressBar...
Отправлено: Rainbow от Июнь 18, 2004, 14:08
А как запускаеш поток?


Название: QThread, progressBar...
Отправлено: Zmey от Июнь 18, 2004, 15:03
Цитата: "Rainbow"
А как запускаеш поток?


   MyThread w;
   w.run();
   w.wait();


Название: QThread, progressBar...
Отправлено: Zmey от Июнь 18, 2004, 15:15
Ответил, а потом думаю, а причем тут w.run(); ?
Исправил на w.start();
Теперь видно, что поток запускается, загружает процессор, то есть копирование идет через него, но проблема не решилась: окно сначала ни на что не реагирует, прогрессбар бежит, а потом окно оживает но замораживается прогрессбар, то есть так как было.


Название: QThread, progressBar...
Отправлено: EugeneVC от Июнь 18, 2004, 16:54
так в чем у тебя проблемма то
окно морозится?


Название: QThread, progressBar...
Отправлено: Anonymous от Июнь 21, 2004, 08:32
Цитата: "EugeneVC"
так в чем у тебя проблемма то
окно морозится?

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


Название: QThread, progressBar...
Отправлено: EugeneVC от Июнь 21, 2004, 14:14
можно попробовать вызывать
qApp->processEvents ();

это позволит избежать заморозки окон


Название: QThread, progressBar...
Отправлено: Zmey от Июнь 22, 2004, 10:45
Большое спасибо.
Кстати, хорошая книга http://hardclub.donntu.edu.ua/projects/qt/books/QT3%20GUI%20Programming.zip. В ней есть такая глава "Staying Responsive During Intensive Processing", описывается как сделать, чтобы не морозилось окно.


Название: QThread, progressBar...
Отправлено: Zmey от Октябрь 25, 2004, 11:55
Трабл с потоками решился так: MyThread w; запускаем поток не  w.start(); , а w.start(QThread::HighestPriority);