winapi — Как я могу придать сообщению окна более высокий приоритет, чем другим сообщениям окна (чтобы окно сообщения не могло его прервать) (c ++)

Я не совсем уверен, как сформулировать этот вопрос, так что, надеюсь, это имеет смысл …

У меня работает графический интерфейс, который читает значения с доски и отображает их в окне. В этом окне также есть меню. Моя проблема в том, что, когда я нажимаю на пункт меню, кажется, что он выпрыгивает из функции обновления до его завершения, что вызывает ошибку связи с моей платы (так как команда не была выполнена до перехода к обработке меню) , Проблема временная, так как я не всегда нажимаю на меню, когда работает функция обновления.

Некоторая дополнительная информация:
Функция обновления отправляется периодически с использованием следующего

PostMessage (hwnd, WM_COMMAND, WM_USER + 1, NULL);

case WM_USER+1:
{
debugFunc = 2;
Update();
InvalidateRect(hwnd, NULL, FALSE);
debugFunc = 2;
}

Целое число debugFunc использовалось для отладки … всякий раз, когда окно отправляло WM_ENTERMENULOOP или WM_EXITMENULOOP, я ломал, чтобы увидеть, каково было это значение debugFunc … всякий раз, когда у меня была ошибка связи, debugFunc == 4 (debugFunc устанавливается в функции обновления 4) … это означает, что это сообщение WM_USER + 1 не было завершено до вызова меню.

Итак, есть ли способ дать либо сообщению WM_USER + 1, либо функции Обновить более высокий приоритет, чем вызов меню? Так что WM_USER + 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
}
}

1

Решение

Задача ещё не решена.

Другие решения