Mengganggu Operasi Salin dan Namakan Semula Fail
Dalam situasi di mana fail besar perlu dipindahkan dan pengguna memerlukan keupayaan untuk membatalkan operasi, kaedah salinan lalai() dan namakan semula() yang ditawarkan oleh Qt boleh mengehadkan. Cabarannya terletak pada mengganggu proses ini tanpa memperkenalkan overhed prestasi yang ketara atau kekecewaan pengguna.
Mentanya Sokongan Gangguan dalam Qt
Semasa menyiasat dokumentasi QFile, ternyata Qt tidak menyediakan mekanisme terbina dalam untuk mengganggu operasi copy() atau namakan semula(). Oleh itu, adalah perlu untuk mempertimbangkan strategi pelaksanaan tersuai untuk menangani keperluan ini.
Pelaksanaan Tersuai untuk Gangguan Salin
Untuk mencipta pembantu salinan tidak menyekat, satu pilihan ialah untuk melaksanakan utas khusus atau menggunakan utas utama. Dalam kedua-dua senario, penyalinan berpecah-belah diperlukan, di mana data dipindahkan dalam ketulan menggunakan penimbal. Dengan menggunakan penimbal, adalah mungkin untuk menjejaki kemajuan operasi dan menampung permintaan pembatalan pengguna.
Langkah teras untuk melaksanakan pembantu salinan tersuai boleh diterangkan seperti berikut:
Laksanakan slot step(), menggunakan QMetaObject::invokeMethod() dengan Qt:: QeuedConnection, yang membenarkan pemprosesan berkala acara pengguna. Dalam slot ini:
Contoh Pelaksanaan
Coretan kod berikut menyediakan contoh pelaksanaan kelas pembantu salinan:
class CopyHelper : public QObject { Q_OBJECT Q_PROPERTY(qreal progress READ progress WRITE setProgress NOTIFY progressChanged) public: CopyHelper(QString sPath, QString dPath, quint64 bSize = 1024 * 1024) : isCancelled(false), bufferSize(bSize), prog(0.0), source(sPath), destination(dPath), position(0) { } ~CopyHelper() { free(buff); } qreal progress() const { return prog; } void setProgress(qreal p) { if (p != prog) { prog = p; emit progressChanged(); } } public slots: void begin() { if (!source.open(QIODevice::ReadOnly)) { qDebug() << "could not open source, aborting"; emit done(); return; } fileSize = source.size(); if (!destination.open(QIODevice::WriteOnly)) { qDebug() << "could not open destination, aborting"; // maybe check for overwriting and ask to proceed emit done(); return; } if (!destination.resize(fileSize)) { qDebug() << "could not resize, aborting"; emit done(); return; } buff = (char*)malloc(bufferSize); if (!buff) { qDebug() << "could not allocate buffer, aborting"; emit done(); return; } QMetaObject::invokeMethod(this, "step", Qt::QueuedConnection); //timer.start(); } void step() { if (!isCancelled) { if (position < fileSize) { quint64 chunk = fileSize - position; quint64 l = chunk > bufferSize ? bufferSize : chunk; source.read(buff, l); destination.write(buff, l); position += l; source.seek(position); destination.seek(position); setProgress((qreal)position / fileSize); //std::this_thread::sleep_for(std::chrono::milliseconds(100)); // for testing QMetaObject::invokeMethod(this, "step", Qt::QueuedConnection); } else { //qDebug() << timer.elapsed(); emit done(); return; } } else { if (!destination.remove()) qDebug() << "delete failed"; emit done(); } } void cancel() { isCancelled = true; } signals: void progressChanged(); void done(); private: bool isCancelled; quint64 bufferSize; qreal prog; QFile source, destination; quint64 fileSize, position; char * buff; //QElapsedTimer timer; };
Kesimpulan
Dengan melaksanakan salinan tersuai pembantu atau menggunakan contoh yang disediakan, adalah mungkin untuk membuat operasi salinan fail tanpa penyekat yang boleh diganggu oleh pengguna. Pendekatan ini membolehkan pemindahan fail yang responsif dan mesra pengguna, menangani kekecewaan yang disebabkan oleh operasi yang panjang yang tidak boleh dibatalkan.
Atas ialah kandungan terperinci Bagaimanakah saya boleh mengganggu operasi salinan fail dan menamakan semula dalam Qt?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!