Operasi Salin dan Namakan Semula Tidak Menyekat dalam Qt
Dalam situasi di mana pengguna mengendalikan fail besar dan perlu mengganggu operasi penyalinan atau nama semula, fungsi Qt lalai terbukti tidak mencukupi. Had ini berpunca daripada sifat menyekat operasi ini, menyebabkan pengguna menunggu proses yang berpotensi panjang untuk diselesaikan walaupun mereka menyedari ralat mereka.
Operasi Salin
Qt tidak menyediakan sebarang penyelesaian terbina untuk operasi salinan tanpa sekatan. Untuk melaksanakan fungsi ini, kelas tersuai dengan pendekatan salinan berpecah-belah diperlukan. Kelas ini harus membenarkan penyalinan fail dalam ketulan, menggunakan penimbal untuk membolehkan penjejakan kemajuan dan responsif terhadap pembatalan pengguna.
Namakan semula Operasi
Begitu juga, Qt tidak menyokong operasi nama semula tanpa sekatan. Memandangkan penamaan semula biasanya dilaksanakan sebagai proses salin kemudian padam, kelas tersuai juga boleh digunakan di sini. Kelas ini boleh melakukan salinan tanpa sekatan dan kemudian memadamkan fail asal setelah salinan selesai.
Pelaksanaan
Berikut ialah contoh kelas tersuai yang melaksanakan operasi salinan tidak menyekat:
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() { // File opening, size checking, and buffer allocation QMetaObject::invokeMethod(this, "step", Qt::QueuedConnection); } void step() { // Read, write, and progress tracking if (isCancelled) { // Delete the copied portion and emit done signal } else if (position < fileSize) { QMetaObject::invokeMethod(this, "step", Qt::QueuedConnection); } else { // Emit done signal } } void cancel() { isCancelled = true; } signals: void progressChanged(); void done(); private: bool isCancelled; quint64 bufferSize; qreal prog; QFile source, destination; quint64 fileSize, position; char * buff; };
Kelas ini membolehkan anda memulakan proses penyalinan, menjejaki kemajuan dan membatalkannya jika perlu. Ia menggunakan pendekatan tanpa sekatan untuk menghalang utas utama daripada dikunci.
Kesimpulan
Dengan melaksanakan kelas tersuai yang memanfaatkan teknik tanpa sekatan, pembangun boleh menyediakan pengguna dengan keupayaan untuk mengganggu salinan fail dan menamakan semula operasi tanpa mengorbankan responsif. Pengalaman pengguna yang dipertingkatkan ini amat berharga apabila berurusan dengan fail besar yang boleh mengambil masa yang lama untuk diproses.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melaksanakan Operasi Salin dan Namakan Semula Tidak Menyekat dalam Qt?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!