从GD_SDK 学到的



  • C/C++

    #if USE_PLATFORM_TYPE_WINDOWS
    #define CALLBACK    __stdcall
    #elif USE_PLATFORM_TYPE_LINUX
    #define CALLBACK
    #endif
    

    _stdcall__cdecl 都属于调用方式

    一般我们在声明函数时都没有显示的说明调用方式,因为不同语言都有不同的默认调用方式

    _stdcall

    _stdcall是Pascal程序的缺省调用方式,通常用于Win32 Api中,由主调用函数采用从右到左的压栈方式进行参数压栈,然后由被调用者弹栈(pop),被调用者自己在退出时清空堆栈。

    _cdecl

    C/C++语言调用中默认的函数修饰_cdecl,由主调用函数进行参数压栈并且恢复堆栈。实参的压栈顺序是从右到左,最后由主调函数进行堆栈恢复(弹栈)。由于主调用函数管理堆栈,所以可以实现变参函数。

    _stdcall主调函数压栈,被调函数弹栈,这样被调函数只能根据他的参数表进行弹栈,所以没有办法实现变参,故而多用来修饰Windows的一些不变参API
    _cdecl主调函数压栈,主调函数弹栈,压栈时已经知道有多个参数,这样可以实现变参,故而可用来修饰如printf等变参的API

    typedef int (CALLBACK* PROCESS_SEARCH_DEVICE_CB)(const GD_MTC_IRDeviceInfo * pDeviceInfo, int nDeviceInfoSize, void * pUser);
    
    // 定义一个回调函数, 该函数类型为CALLBACK*
    // 返回值为 int
    // 参数为 pDeviceInfo, nDeviceInfoSize, pUser
    // PROCESS_SEARCH_DEVICE_CB 为该函数指针的别名
    
    memset(this, 0, sizeof *this)
    // 在c++ 中 可以将结构体中的各种变量初始化为0
    // 该语句一般要放在构造函数中
    
    

    有时候类里面定义了很多int,char,struct等c语言里的那些类型的变量,要在构造函数中将它们初始化为0,但是一句句的写太麻烦,所以直接就memset(this, 0, sizeof *this);将整个对象的内存全部置为0。对于这种情形可以很好的工作,但是下面几种情形是不可以这么使用的:

    1.类含有虚函数表:这么做会破坏虚函数表,后续对虚函数的调用都将出现异常

    2.类中含有C++类型的对象:例如,类中定义了一个list的对象,由于在构造函数体的代码执行之前就对list对象完成了初始化,假设list在它的构造函数里分配了内存,那么我们这么一做就破坏了list对象的内存。

    某些人认为不应该在构造函数中使用this指针,因为这时this对象还没有完全形成。

    但是,只要小心,是可以在构造函数中使用this指针的:

    初始化列表中

    因为“对象还没有完全形成”不意味着“什么都没有”。

    在进入构造函数(及其chaining)之前,Compiler会:

    ●给class的instance分配内存

    ●建立运行时刻系统所需的信息(如vtbl等)

    缺省地构造所有类成员

    -----------------------------【能】---------------------------------

    构造函数的函数体(或构造函数所调用的函数)【能】可靠地访问:

    ●基类中声明的数据成员

    ●构造函数所属类声明的数据成员

    这是因为所有这些数据成员被保证在构造函数函数体开始执行时已经被完整的建立。

    -----------------------------【不能】---------------------------------

    构造函数的函数体(或构造函数所调用的函数)【不能】向下调用:

    ●被派生类重定义的虚函数

    这是因为在基类的构造函数执行期间,“对象还不是一个派生类的对象”。

    Qt

    Qt之信号signals和槽slots详解



  • 搜索设备

    • GD_MTC_SDK_StartSearchDevice() : SDK接口,搜索局域网内的设备
    • serarchDeviceCbFun() : 回调函数,对搜索结果进行处理
    • 回调函数负责将搜索的设备的ip显示

    打开设备的流程

    • 首先需要判断设备是否在短时间内被多次打开 m_dtPreOpenDevice :上次打开设备的时间

    • 打开新的设备之前关闭之前的数据流 m_bDataStreamIsOpen :数据流是处于打开状态

    关闭数据流

    • 判断要连接的设备的ip格式是否合格 搜索到的设备ip在图形界面文本框中,如果合格将ip存入m_strIp

    • 根据ip获取设备的类型 GD_MTC_SDK_GetDeviceType() 存入 m_nDeviceType

    • 根据选择的数据流格式,采用不同的接口打开 openStreamDlg()

    打开数据流

    • 根据ip和设备类型GD_MTC_SDK_Login() 登录设备获取登入IDm_nLoginId
    • 获取视频连接参数 GD_MTC_IRLinkInfo
    • 打开数据流GD_MTC_SDK_OpenStream(),获取到数据流会话IDm_nSessionId
    • 设置m_nPaletteIndex Y16数据的帧率
    • 设置m_nPullDataType 取数据模式
    • 设置调光模式GD_MTC_SDK_SetAdjustLightMode(),手动模式需要检测输入值是否合法并用GD_MTC_SDK_SetSpanMax()GD_MTC_SDK_SetSpanMin()进行设置
    • 获取设备信息GD_MTC_SDK_GetDeviceInfo() 填充m_deviceInfo
    • 获取色带信息 设置电子变焦中心等

    关闭数据流

    • 数据流是否处于打开模式,如果是关闭
    • 关闭数据流 GD_MTC_SDK_CloseStream() 参数为会话ID,即打开的数据流ID
    • 登出设备 GD_MTC_SDK_Logout() 参数为设备登入ID, m_nLoginId
    • 改变界面控制按钮状态, 改变设备连接状态显示
    • GD_MTC_LogMemInfo()

登录后回复
 

Copyright © 2018 bbs.dian.org.cn All rights reserved.

与 Dian 的连接断开,我们正在尝试重连,请耐心等待