Study
Qt

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.

Editor Latihan

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.