wujken 2019-04-23 12:26 采纳率: 0%
浏览 351

高手在哪,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条回答 默认 最新

  • 铸仙 2019-04-24 10:50
    关注

    你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了。

    评论

报告相同问题?

悬赏问题

  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题
  • ¥15 Python时间序列如何拟合疏系数模型
  • ¥15 求学软件的前人们指明方向🥺
  • ¥50 如何增强飞上天的树莓派的热点信号强度,以使得笔记本可以在地面实现远程桌面连接