У меня есть проект VS 2005 C ++ MFC, который содержит несколько окон на основе CDialog.Программа связывается с нестандартным оборудованием и отображает различные показания в разных окнах.Данные считываются с аппаратного обеспечения с помощью общедоступной статической функции-члена с именем ReadHardWare () класса с именем CTools.ReadHardWare () помещает данные, считанные с аппаратного обеспечения, в массив с глобальной областью действия, и каждое окно имеет возможность чтения из этого массива.В каждом окне у меня загорается индикатор, показывающий, что выполняется операция чтения с оборудования.Этот индикатор является классом управления National Instruments Measurement Studio CNiButton.CTools имеет открытую статическую переменную-член типа CNiButton с именем m_read_in_progress_status, которую я использую, чтобы определить, выполняется операция чтения (m_read_in_progress_status.Value == 1) или нет (m_read_in_progress_status.Value == 0).Моя цель состоит в том, чтобы все индикаторы чтения во всех открытых окнах показывали, что чтение выполняется или не выполняется одновременно.Я регулярно использую DoDataExchange для связи переменных с элементами управления, но всегда один на один.В этом случае я хочу, чтобы несколько элементов управления соединялись с одной переменной и автоматически обновлялись с этой переменной.
Кажется, у меня есть две проблемы:
1) Кажется, я могу одновременно иметь только один элемент управления, связанный с переменной.По-видимому, единственным элементом управления, с которым переменная делится данными, является первый экземпляр (то есть первое открытое окно)
2) Если я посылаю команду чтения из второго открытого окна, индикатор чтения не только на второмокно все еще не показывает статус чтения, но и индикатор чтения больше не отображается на первом.Единственный раз, когда работает любой из индикаторов чтения, это когда я выполняю команду чтения из первого открытого окна.Похоже, первое окно не хочет обновлять свои элементы управления, когда второе окно отправляет команду чтения.
Итак, мои вопросы:
1) Как я могу разрешить двум элементам управления в двух разных окнах совместно использовать одну и ту же переменную-член и обновлять сразу после изменения значения этой переменной-члена?
2) Как я могу заставить функцию-член ReadHardWare () (или какое-либо другое событие) принудительно заставить первое окно обновлять свои элементы управления, даже если это окно не активно вызывает эту функцию?
В текущем случае первое окно является родителем второго.Однако это не всегда так.
Ниже приведен отрывок из моего кода.
// Globalvariables.cpp
NI::CNiButton CTools::m_read_in_progress_status;
// Tools.h
class CTools
{
public:
static ReadHardWare();
public:
static NI::CNiButton m_read_in_progress_status;
}
// Tools.cpp
CTools::ReadHardWare()
{
//Declare and initialize variables and other setup code is here
m_read_in_progress_status.Value == 1 //Set read in progress flag high
//Read operations here
m_read_in_progress_status.Value == 0 //Reset read in progress flag low
}
//FirstWindow.cpp
#include "Tools.h"
#include "SecondWindow.h"
void CFirstWindow::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_First_Window_Read_in_Progress_Indicator, CTools::m_read_in_progress_status);
}
// SecondWindow.cpp
#include "Tools.h"
#include "FirstWindow.h"
void CSecondWindow::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_Second_Window_Read_in_Progress_Indicator, CTools::m_read_in_progress_status);
}