高手在哪,MFC多线程问题,卡了一周了,求救?

创建了16个线程分别控制不同的HID设备,对HID设备进行操作
#define ThreadCount 16

CWinThread* m_pThread[ThreadCount];
HANDLE m_hEvent[ThreadCount];

    void CTestDlg::OnBnClickedButton1()
    {
            int i;
            if (m_nStartorStop == 0)
            {
                    m_nStartorStop = 1;
                    SetDlgItemText(IDC_BUTTON_START, L"停止");

                    for (i=0; i<ThreadCount; i++)
                    {
                            m_hEvent[i]=CreateEvent(NULL,TRUE,FALSE,NULL);
                            m_pThread[i] = AfxBeginThread(SatrtThreadFunc,&i);
                    }
            }
            else
            {
                    m_nStartorStop = 0;
                    SetDlgItemText(IDC_BUTTON_START, L"启动");

                    for (i=0; i<ThreadCount; i++)
                    {
                            SetEvent(m_hEvent[i]);
                            Sleep(100);
                    }
            }
    }

    线程函数如下:
    UINT SatrtThreadFunc(LPVOID lpParam)
    {
            int nclr = *((int*)lpParam);
            while(WaitForSingleObject(m_hEvent[nclr],1000)!=WAIT_OBJECT_0)
            {
                    // 操作HID设备,(打开HID、写入、读取、关闭)
            }

            TRACE("Run:%d\n",nclr);
            CloseHandle(m_hEvent[nclr]);
            m_hEvent[nclr] = NULL;
            return 0;
    }

    执行“停止线程”操作时,总有几个线程退不出来,实在想不到方法,求各位高手指导啊

1个回答

你Trace 日志里面run 有没有重复的nclr ? 如果有的话是传参出现问题。

m_pThread[i] = AfxBeginThread(SatrtThreadFunc,&i);

改成
m_pThread[i] = AfxBeginThread(SatrtThreadFunc,(LPVOID )i);
int nclr = (int)lpParam);

你那种写法,存的是i的地址,参数中存地址,子线程中执行第一句赋值和主线程继续创建线程是并发执行的没法保证顺序。
也就是说可能第一个线程传参时 i=1, 赋值的时候i 被改成2了。

wujken
wujken 多谢多谢
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐