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 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题