我正在开发一个Qt对象的API,用于抽象与一块硬件的通信。此硬件具有基于TCP的API,用于与其进行接口。硬件具有一些属性(例如设备名称,IP地址等),控制功能(例如打开或关闭逻辑输出),以及它可以产生的事件(例如,逻辑值已经改变)。
在创建对象时,我自然地将设备的属性设置为对象属性(即具有getter和setter的私有变量)。控制功能在对象中实现为公共功能/槽,它们实现适当的底层TCP查询。这些事件由套接字接收,由我的对象作为信号处理和发出。
所有这些都很有效,除了有一些并发症我似乎无法找到一个好方法来解决。首先,Qt套接字接口自然都是基于事件的,这使得我的对象API的一些语义变得困难。例如,如果我想获取对象的名称,我会执行以下操作:
QString name = MyObject->name();
但问题是此信息来自对TCP套接字的查询。由于一切都应该是非阻塞的,我怎么能以这种方式获取属性。此外,设备可能会生成一个事件,指示此对象需要接收的属性更改并相应地更改其内部属性(尽管不是那么困难)。
我能想出的唯一想法是使用某种 ready()函数,用户可以调用该函数来检查对象中的数据是否已从API中获取。
也许一个具体的例子会有所帮助(可能会出现轻微的语法错误):
class Device: public QObject {
Q_OBJECT
private:
QString property1_;
QString property2_;
NetworkApi *api_;
public:
void Device(NetworkApi *api, QObject *parent = 0);
QString property1();
QString property2();
signals:
void eventOccurred(QString arg); //An event from the api is parsed and then this signal is emitted
public slots:
QString setProperty1(QString val); //Performs a network query
QString setProperty2(QString val); //Performs a network query
QString performAction(); //Causes the device to perform some action by making a network query
};
在我的API中,每个API对象都存储一个指向处理所有套接字事物的对象的指针。如果您要调用performAction(),则此对象将告诉API对物理设备进行查询。然后,该设备最终会发出一个事件,表示已经执行了一个动作(例如“打开输出” - >“输出已打开”)。该对象从API对象接收事件,解析它并生成信号。
希望我想要完成的事情是有道理的。如果我需要提供更多信息,请告诉我。
谢谢, 帕特里克