Multithreading Dasar dengan QThread
Penjelasan
Tugas yang berat/lama (mis. proses file besar, network request lambat) yang dijalankan LANGSUNG di thread utama akan membuat UI MEMBEKU (tidak responsif) — karena thread utama itu jugalah yang menangani event loop UI. QThread memindahkan tugas berat ke thread TERPISAH, hasilnya dikomunikasikan balik ke UI lewat Signals & Slots (yang thread-safe secara built-in).
Contoh Konsep
class WorkerBerat : public QObject
{
Q_OBJECT
public slots:
void kerjakan()
{
for (int i = 0; i < 5; i++) {
QThread::sleep(1); // simulasi pekerjaan berat
emit progress(i + 1);
}
emit selesai();
}
signals:
void progress(int persen);
void selesai();
};
// Pemakaian:
// QThread *thread = new QThread();
// WorkerBerat *worker = new WorkerBerat();
// worker->moveToThread(thread);
// connect(thread, &QThread::started, worker, &WorkerBerat::kerjakan);
// connect(worker, &WorkerBerat::selesai, thread, &QThread::quit);
// thread->start();
Praktikum
Buat class WorkerUnduh (turunan QObject) dengan slot mulaiUnduh() yang men-simulasikan proses unduh 3 detik (QThread::sleep(3)) lalu meng-emit signal unduhSelesai(). Jelaskan (sebagai komentar) kenapa proses ini SEBAIKNYA dijalankan di QThread terpisah, bukan langsung di thread utama.
Ketik/edit bebas di sini untuk latihan — kode ini tidak dijalankan.
Tips
JANGAN PERNAH mengubah/mengakses widget UI LANGSUNG dari dalam thread lain — Qt Widgets TIDAK thread-safe, mengaksesnya dari thread selain thread utama bisa menyebabkan crash tak terduga. Selalu komunikasikan hasil dari worker thread balik ke thread utama lewat Signals & Slots seperti dicontohkan, bukan manipulasi widget langsung.