MFC线程和定时器方式读取PLC参数,线程失败,定时器成功,线程内存访问冲突

MFC里面的初始化代码

/* 连接PLC */
    shoudongDlg.PlcSDCtx=NULL; //将手动子对话框指针变量初始化
    parameterDlg.PlcCSCtx=NULL;
    PlcMctx=modbus_new_tcp("192.168.1.5",502);  //创建一个TCP连接PLC的写参数类型容器
    modbus_set_debug(PlcMctx,TRUE);     //设置debug模式  
    shoudongDlg.PlcSDCtx=PlcMctx;  //将主对话框的网络参数赋值子对话框指针变量
    if (modbus_connect(PlcMctx)==-1||modbus_connect(PlcRMctx)==-1)
       {
         MessageBox(_T("请检查PLC网络设置"));
         
        }
    MDConnect=modbus_connect(PlcRMctx);
    if(MDConnect==-1)
    {
    MessageBox(_T("连接失败"), _T(""), 0);
    
    }    
    AfxBeginThread(PLCparReadThread,0,THREAD_PRIORITY_TIME_CRITICAL,0,0);

用定时器读取可以参数

这个是另一个对话框里面的PlcSDCtx我是在头文件赋了PlcMctx值个它

void CshoudongDlg::OnTimer(UINT_PTR nIDEvent)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
#if 1
    if(nIDEvent == 1)
    {
    uint16_t PlcDate[100]={0};
    uint16_t PlcDate1[100]={0};
    uint16_t PlcDate2[100]={0};
    int ReadPlcData;
    ReadPlcData=modbus_read_registers(PlcSDCtx,0, 100, PlcDate);//读取PLC0到100寄存器的值
    Sleep(5);
    ReadPlcData=modbus_read_registers(PlcSDCtx,30000, 100, PlcDate1);//读取PLC0到100寄存器的值
    Sleep(5);
    ReadPlcData=modbus_read_registers(PlcSDCtx,30101, 100, PlcDate2);//读取PLC0到100寄存器的值
    Sleep(5);
    Y1RuningWZ=PlcDate[1]<<16|PlcDate[0];//将DDT0的值赋给手动对话框的Y实时显示
    Y2RuningWZ=PlcDate[7]<<16|PlcDate[6];
    UpdateData(FALSE);
    }

#endif

    CDialogEx::OnTimer(nIDEvent);
}

用了这个线程来读PLC参数失败了,想请教是什么原因?

//读PLC参数线程
UINT CMFCPCBTestDlg::PLCparReadThread(LPVOID lParm)
{
    modbus_t *ThreadPlcMctx;
    CMFCPCBTestDlg * pDlg = (CMFCPCBTestDlg *)lParm;
    ThreadPlcMctx=modbus_new_tcp("192.168.1.5",502);
    while(WaitForSingleObject(ReadPlcThread,2)!=WAIT_OBJECT_0)
    {
    uint16_t PlcDate[100]={0};
    uint16_t PlcDate1[100]={0};
    uint16_t PlcDate2[100]={0};
    int ReadPlcData;
    ReadPlcData=modbus_read_registers(ThreadPlcMctx,0, 100, PlcDate);//读取PLC0到100寄存器的值
    Sleep(5);
    ReadPlcData=modbus_read_registers(ThreadPlcMctx,30000, 100, PlcDate1);//读取PLC30000到30100寄存器的值
    Sleep(5);
    ReadPlcData=modbus_read_registers(ThreadPlcMctx,30101, 100, PlcDate2);//读取PLC30100到30200寄存器的值
    Sleep(5);

    }
    return 0;
}

把线程函数改成以下这样也不行,调试时候报内存访问冲突,请问是什么原因,是哪里出错引起了吗?

//读PLC参数线程
UINT CMFCPCBTestDlg::PLCparReadThread(LPVOID lParm)
{
    
    CMFCPCBTestDlg * pDlg = (CMFCPCBTestDlg *)lParm;
    while(WaitForSingleObject(ReadPlcThread,2)!=WAIT_OBJECT_0)
    {
    uint16_t PlcDate[100]={0};
    uint16_t PlcDate1[100]={0};
    uint16_t PlcDate2[100]={0};
    int ReadPlcData;
    ReadPlcData=modbus_read_registers(pDlg->PlcMctx,0, 100, PlcDate);//读取PLC0到100寄存器的值
    Sleep(5);
    ReadPlcData=modbus_read_registers(pDlg->PlcMctx,30000, 100, PlcDate1);//读取PLC30000到30100寄存器的值
    Sleep(5);
    ReadPlcData=modbus_read_registers(pDlg->PlcMctx,30101, 100, PlcDate2);//读取PLC30100到30200寄存器的值
    Sleep(5);

    }
    return 0;
}

困扰多天,希望能得到指教,谢谢谢谢

你把PLCparReadThread定义改为static类型试试

经过请教,是我线程的创建不对,把开线程函数的第二个参数改this,改成这个AfxBeginThread(PLCparReadThread,this,THREAD_PRIORITY_TIME_CRITICAL,0,0);线程知识不过关,还需要加强