我如何给一个窗口消息赋予比其他窗口消息更高的优先级(这样一个窗口消息就不能中断它)(c++)

我如何给一个窗口消息赋予比其他窗口消息更高的优先级(这样一个窗口消息就不能中断它)(c++),c++,winapi,message-queue,i2c,C++,Winapi,Message Queue,I2c,我真的不知道这个问题怎么说,所以希望这是有意义的 我有一个GUI,可以从一块板上读取值,并在窗口中显示它们。这个窗口还有一个菜单。我的问题是,当我点击一个菜单项时,它似乎在更新功能完成之前就跳出了我的更新功能,这给了我一个来自主板的通信错误,因为命令在切换到菜单处理之前没有完成。问题是间歇性的,因为在运行更新功能时,我并不总是单击菜单 其他一些信息: 使用以下命令定期发送更新函数 PostMessagehwnd,WM_命令,WM_USER+1,NULL case WM_USER+1: {

我真的不知道这个问题怎么说,所以希望这是有意义的

我有一个GUI,可以从一块板上读取值,并在窗口中显示它们。这个窗口还有一个菜单。我的问题是,当我点击一个菜单项时,它似乎在更新功能完成之前就跳出了我的更新功能,这给了我一个来自主板的通信错误,因为命令在切换到菜单处理之前没有完成。问题是间歇性的,因为在运行更新功能时,我并不总是单击菜单

其他一些信息: 使用以下命令定期发送更新函数

PostMessagehwnd,WM_命令,WM_USER+1,NULL

case WM_USER+1:
{
    debugFunc = 2;
    Update();   
    InvalidateRect(hwnd, NULL, FALSE);
    debugFunc = 2;
}
debugFunc整数用于调试…每当窗口发送WM_EnterMenuLop或WM_EXITMENULOOP时,我都会中断以查看此debugFunc值是什么…每当出现通信错误时,debugFunc==4 debugFunc在更新函数中设置为4…意味着此WM_用户+1消息在调用菜单之前未完成

那么,有没有一种方法可以给消息WM_USER+1或函数Update赋予比菜单调用更高的优先级?在显示菜单项之前,必须完成WM_用户+1或更新

编辑::这里是更新,它只是使用I2C适配器发送一组消息以获取读取。。 我没有编写任何iPortAIMaster函数,它们是随适配器提供的

void Update()
{
    int receiveLength = 0;
    debugFunc = 4;
    //The following CStrings hold a string value that is to be updated to the window
    CString newVoltage, newCurrent, newPower, newStatus;
    CString StatusDisplay;

    //The following act like flags
    //If STATUS_WORD VOUT bit is set, checkVout = 1...meaning all pages must have their Vout Status checked
    //The rest follow in a similar fashion
    int checkTemp = 0, checkVout = 0, checkIout = 0, checkInput = 0;

    //Holds the pBuf data output from a MasterTxRx command is sent
    //Holds the new voltage or new current values
    //Must be translated to a CString to update the window
    BYTE *nV, *nC;

    //Holds a bit position
    int bit;
    float valueV, valueC;

        if (isOn)
        {
            pBufStatus[0] = 0x79;    //STATUS_WORD
            ////buf += "\r\n Sending the STATUS_WORD command to check for errors";
            //BYTE I2CAddr, BYTE *pBufStatus, unsigned int TxLen, unsigned int RxLen, BYTE doStop, UINT time
            newPort.iPortAIMasterTxRx(I2CAddr, pBufStatus, 1, 2, 1, 820);
            //Get the PAGE reading, value is placed in pBufStatus
            receiveLength = newPort.iPortAIGetMasterRxMsg(512, pBufStatus);
            //Store pBufStatus
            pBufWORD[0] = pBufStatus[0];
            pBufWORD[1] = pBufStatus[1];

    #pragma region "Reading and Updating the window"

    #pragma region "Reading new IN Volt Cur Pow"
    {
                valueV = 0;
                valueC = 0;

                //Read_VIN
                pBufStatus[0] = 0x88;       //Read_VIN Command
                pBufStatus[1] = 0;      //Clear out earlier command

                //Send Read_VIN command
                MasterTxRx(I2CAddr, pBufStatus, 1, 2, 1, 120);
                //Get the Voltage Reading, value is placed in pBufStatus
                newPort.iPortAIGetMasterRxMsg(512, pBufStatus);
                nV = pBufStatus;    //Save Copy

                //CONVERT THE VALUE TO USEABLE FORM
                valueV = ((int)valueV << 8) + pBufStatus[1];
                valueV = ((int)valueV << 8) + pBufStatus[0];
                //Multiply by 100 for formatting
                valueV = valueV / 100;

                newVoltage.Format("%.2f", valueV);

                //Read_IIN command
                pBufStatus[0] = 0x89;       //Read_IIN Command

                //Send Read_IIN command
                MasterTxRx(I2CAddr, pBufStatus, 1, 2, 1, 120);
                //Get the Voltage Reading, value is placed in pBufStatus
                newPort.iPortAIGetMasterRxMsg(512, pBufStatus);
                nC = pBufStatus;    //Save Copy

                //CONVERT THE VALUE TO USEABLE FORM
                valueC = ((int)valueC << 8) + pBufStatus[1];
                valueC = ((int)valueC << 8) + pBufStatus[0];
                //Multiply by 100 for formatting
                valueC = valueC / 100;

                newCurrent.Format("%.2f", valueC);

                newPower.Format("%.2f", (valueC*valueV));

                //SetWindowText(VoltIn, newVoltage);
                //SetWindowText(CurIn, newCurrent);
                //SetWindowText(PowIn, newPower);
                VoltInR = newVoltage;
                CurInR = newCurrent;
                PowInR = newPower;
    }
    #pragma endregion

    #pragma region "Reading new Temperatures"
    {
            valueV = 0;
            //READ_TEMPERATURE_1
            pBufStatus[0] = 0x8D;       //Read_VIN READ_TEMPERATURE_1
            pBufStatus[1] = 0;      //Clear out earlier command

            //Send READ_TEMPERATURE_1 command
            MasterTxRx(I2CAddr, pBufStatus, 1, 2, 1, 120);
            //Get the Voltage Reading, value is placed in pBufStatus
            newPort.iPortAIGetMasterRxMsg(512, pBufStatus);
            nV = pBufStatus;    //Save Copy

            //CONVERT THE VALUE TO USEABLE FORM
            valueV = ((int)valueV << 8) + pBufStatus[1];
            valueV = ((int)valueV << 8) + pBufStatus[0];
            //Multiply by 100 for formatting
            valueV = valueV / 100;

            newVoltage.Format("%.2f", valueV);
            //SetWindowText(TempU11, newVoltage);
            TempU11R = newVoltage;

            valueV = 0;
            //READ_TEMPERATURE_2
            pBufStatus[0] = 0x8E;       //Read_VIN READ_TEMPERATURE_2
            pBufStatus[1] = 0;      //Clear out earlier command

            //Send READ_TEMPERATURE_2 command
            MasterTxRx(I2CAddr, pBufStatus, 1, 2, 1, 120);
            //Get the Voltage Reading, value is placed in pBufStatus
            newPort.iPortAIGetMasterRxMsg(512, pBufStatus);
            nV = pBufStatus;    //Save Copy

            //CONVERT THE VALUE TO USEABLE FORM
            valueV = ((int)valueV << 8) + pBufStatus[1];
            valueV = ((int)valueV << 8) + pBufStatus[0];
            //Multiply by 100 for formatting
            valueV = valueV / 100;

            newVoltage.Format("%.2f", valueV);
            //SetWindowText(TempU12, newVoltage);
            TempU12R = newVoltage;

            valueV = 0;
            //READ_TEMPERATURE_3
            pBufStatus[0] = 0x8F;       //Read_VIN READ_TEMPERATURE_3
            pBufStatus[1] = 0;      //Clear out earlier command

            //Send READ_TEMPERATURE_3 command
            MasterTxRx(I2CAddr, pBufStatus, 1, 2, 1, 120);
            //Get the Voltage Reading, value is placed in pBufStatus
            newPort.iPortAIGetMasterRxMsg(512, pBufStatus);
            nV = pBufStatus;    //Save Copy

            //CONVERT THE VALUE TO USEABLE FORM
            valueV = ((int)valueV << 8) + pBufStatus[1];
            valueV = ((int)valueV << 8) + pBufStatus[0];
            //Multiply by 100 for formatting
            valueV = valueV / 100;

            newVoltage.Format("%.2f", valueV);
            //SetWindowText(TempU13, newVoltage);
            TempU13R = newVoltage;
    }
    #pragma endregion

            for (int i = 0; i < 11; i++)
            {
                valueV = 0;
                valueC = 0; 

                //FOR LOOP Index thru pages
                //i = 0 +5V
                //i = 1 +3.3V
                //i = 2 +12V
                //i = 3 -12V
                //i = 4 +12V_AUX
                //i = 10    +28V_Input
                pBufStatus[0] = 0x00;           //Page Command
                pBufStatus[1] = (char)i;        //Page Number
                MasterTx(I2CAddr, pBufStatus, 2, 1, 60);

    #pragma region "Reading new OUT Volt Cur Pow"
                switch (i)
                {
                    case 0:
                    case 1:
                    case 2:
                    {
                        //Read_VOUT
                        pBufStatus[0] = 0x8B;       //Read_Vout Command
                        pBufStatus[1] = 0;      //Clear out earlier command

                        //Send Read_VOUT command
                        MasterTxRx(I2CAddr, pBufStatus, 1, 2, 1, 120);
                        //Get the Voltage Reading, value is placed in pBufStatus
                        newPort.iPortAIGetMasterRxMsg(512, pBufStatus);
                        nV = pBufStatus;    //Save Copy

                        //CONVERT THE VALUE TO USEABLE FORM
                        valueV = ((int)valueV << 8) + pBufStatus[1];
                        valueV = ((int)valueV << 8) + pBufStatus[0];
                        //Multiply by 100 for formatting
                        valueV = valueV / 100;

                        newVoltage.Format("%.2f", valueV);

                        //Read_IOUT command
                        pBufStatus[0] = 0x8C;       //Read_Iout Command

                        //Send Read_IOUT command
                        MasterTxRx(I2CAddr, pBufStatus, 1, 2, 1, 120);
                        //Get the Voltage Reading, value is placed in pBufStatus
                        newPort.iPortAIGetMasterRxMsg(512, pBufStatus);
                        nC = pBufStatus;    //Save Copy

                        //CONVERT THE VALUE TO USEABLE FORM
                        valueC = ((int)valueC << 8) + pBufStatus[1];
                        valueC = ((int)valueC << 8) + pBufStatus[0];
                        //Multiply by 100 for formatting
                        valueC = valueC / 100;

                        newCurrent.Format("%.2f", valueC);

                        newPower.Format("%.2f", (valueC*valueV));
                        break;
                    }
                    case 3:
                    case 4:
                    {
                        //Read_VOUT
                        pBufStatus[0] = 0x8B;       //Read_Vout Command
                        pBufStatus[1] = 0;      //Clear out earlier command

                        //Send Read_VOUT command
                        MasterTxRx(I2CAddr, pBufStatus, 1, 2, 1, 120);
                        //Get the Voltage Reading, value is placed in pBufStatus
                        newPort.iPortAIGetMasterRxMsg(512, pBufStatus);
                        nV = pBufStatus;    //Save Copy

                        //CONVERT THE VALUE TO USEABLE FORM
                        valueV = ((int)valueV << 8) + pBufStatus[1];
                        valueV = ((int)valueV << 8) + pBufStatus[0];
                        //Multiply by 100 for formatting
                        valueV = valueV / 100;

                        newVoltage.Format("%.2f", valueV);
                        break;
                    }
                    case 10:
                    {
                        //Read_VOUT
                        pBufStatus[0] = 0x8B;       //Read_Vout Command
                        pBufStatus[1] = 0;      //Clear out earlier command

                        //Send Read_VOUT command
                        MasterTxRx(I2CAddr, pBufStatus, 1, 2, 1, 120);
                        //Get the Voltage Reading, value is placed in pBufStatus
                        newPort.iPortAIGetMasterRxMsg(512, pBufStatus);
                        nV = pBufStatus;    //Save Copy

                        //CONVERT THE VALUE TO USEABLE FORM
                        valueV = ((int)valueV << 8) + pBufStatus[1];
                        valueV = ((int)valueV << 8) + pBufStatus[0];
                        //Multiply by 100 for formatting
                        valueV = valueV / 100;

                        newVoltage.Format("%.2f", valueV);
                        break;
                    }
                }
    #pragma endregion

    #pragma region "Display reading"
                    switch (i)  //switch on the page number, display new values and checks faults if needed
                    {                       
                        case 0:         //+5V
                        {
        #pragma region "5V Display"
                            {
                                //SEND OUTPUT TO WINDOW USING SetWindowText();
                                //SetWindowText(Volt5at24, newVoltage);
                                Volt5at24R = newVoltage;
                                //SetWindowText(Cur5at24, newCurrent);
                                Cur5at24R = newCurrent;
                                //SetWindowText(Pow5at24, newPower);
                                Pow5at24R = newPower;
                                break;
                            }
        #pragma endregion
                        }
                        case 1:         //+3.3V
                        {
        #pragma region "3.3V Display"
                            {
                                //SEND OUTPUT TO WINDOW USING SetWindowText();
                                //SetWindowText(Volt3at15, newVoltage);
                                Volt3at15R = newVoltage;
                                //SetWindowText(Cur3at15, newCurrent);
                                Cur3at15R = newCurrent;
                                //SetWindowText(Pow3at15, newPower);
                                Pow3at15R = newPower;
                                break;
                            }
        #pragma endregion
                        }
                        case 2:         //+12V
                        {
        #pragma region "12V Display"
                            {
                                //SEND OUTPUT TO WINDOW USING SetWindowText();
                                //SetWindowText(Volt12at1, newVoltage);
                                Volt12at1R = newVoltage;
                                //SetWindowText(Cur12at1, newCurrent);
                                Cur12at1R = newCurrent;
                                //SetWindowText(Pow12at1, newPower);
                                Pow12at1R = newPower;
                                break;
                            }
        #pragma endregion
                        }
                        case 3:         //-12V
                        {
        #pragma region "-12V Display"
                            {
                                //SEND OUTPUT TO WINDOW USING SetWindowText();
                                //SetWindowText(Volt12at2, newVoltage);
                                Volt12at2R = newVoltage;
                            }
        #pragma endregion
                        }
                        case 4:         //+12V AUX
                        {
        #pragma region "12V AUX Display"
                            {
                                //SEND OUTPUT TO WINDOW USING SetWindowText();
                                //SetWindowText(Volt12at40, newVoltage);
                                Volt12at40R = newVoltage;
                            }
        #pragma endregion
                        }
                        case 10:            //+28V input
                        {
        #pragma region "3.3 HSKPR Display"
                            {
                                //SEND OUTPUT TO WINDOW USING SetWindowText();
                                //SetWindowText(VoltIn, newVoltage);
                                Volt3HR = newVoltage;
                                break;
                            }
        #pragma endregion
                        }
                    }
    #pragma endregion
                }
    #pragma endregion       
        }
}

这毫无意义。这里没有优先权。这些信息被提取出来并按顺序处理。问题在于我们看不到的代码。你需要做一个MCVE。你有休息时间吗;代码中的语句,在WM_USER+1的情况下:?您没有在上面的代码段中显示它。当您在WM_EnterMenuLop中打开并发现您仍然在更新中时,请查看调用堆栈。堆栈上Update右上方的函数是一个生成。我怀疑您使用的包装器以某种方式利用了窗口消息。@IgorTandetnik是的,谢谢!idk为什么我从来没有想过使用调用堆栈,结果是适配器函数正在处理消息…所以我必须找到一种方法来避免它…该死的:/well无论如何,谢谢你帮我找到问题@MartinJames建议,你可能想将硬件交互移到一个单独的工作线程。