Trước tiên, bạn phải bắt đầu thread trong một cách rất MFC không xóa các đối tượng thread khi nó finished, các thiết lập mặc định cho MFC sợi là xóa bản thân, do đó bạn muốn chuyển mà đi.
m_thread = AfxBeginThread(ThreadProc, this, THREAD_PRIORITY_NORMAL ,CREATE_SUSPENDED);
m_thread->m_bAutoDelete = FALSE;
m_thread->ResumeThread();
Bây giờ trong chuỗi, bạn muốn có một cơ chế mà chuỗi người gọi có thể gửi tín hiệu kết thúc. Có nhiều cách, một là WaitForSingleObject
để kiểm tra trạng thái của tín hiệu hoặc cách khác là chỉ cần gửi chủ đề này một tin nhắn để tự kết thúc. Đây là kết thúc duyên dáng thay vì giết chết nó.
Trong khi chủ đề này tự kết thúc (= thoát khỏi hàm chuỗi, dọn dẹp), bạn có thể đợi chủ đề chính trên đó kết thúc trước khi thoát.
int wait = 2000 // seconds (I am waiting for 2 seconds for worker to finish)
int dwRes = WaitForSingleObject(m_thread->m_hThread, wait);
switch (dwRes)
{
case WAIT_OBJECT_0:
TRACE(_T("worker thread just finished")); break;
case WAIT_TIMEOUT:
TRACE(_T("timed out, worker thread is still busy")); break;
}
Lưu ý thiết lập m_bAutoDelete = FALSE
ở trên làm cho chúng tôi có thể vẫn có tay cầm hợp lệ khi ren kết thúc để chúng tôi có thể đợi. Điều cuối cùng bạn muốn làm bây giờ là xóa đối tượng CWinThread để giải phóng bộ nhớ của nó (vì chúng ta đã chịu trách nhiệm thực hiện điều đó).