Basestation函数解析(一)

---恢复内容开始---

1._tmain    _tmain()是微软操作系统(windows)提供的对unicode字符集和ANSI字符集进行自动转换用的程序入口点函数。

首先,这个_tmain()是为了支持unicode所使用的main一个别名而已,既然是别名,应该有宏定义过的,在哪里定义的呢?就在那个让你困惑的<stdafx.h>里,有这么两行
#include <stdio.h>
#include <tchar.h>
我们可以在头文件<tchar.h>里找到_tmain的宏定义:#define _tmain main
所以,经过预编译以后, _tmain就变成main了。

int _tmain(int argc, TCHAR *argv[])
当你程序当前的字符集为unicode时,int _tmain(int argc, TCHAR *argv[])会被翻译成
int wmain(int argc, wchar_t *argv[])
当你程序当前的字符集为ANSI时,int _tmain(int argc, TCHAR *argv[])会被翻译成
int main(int argc, char *argv[])

2. CCommFunc::GetProgrammeDir  获取程序当前路径

  GetModuleFileName  函数返回当前进程已加载可执行或DLL文件的完整路径名(以'\0'终止),该模块必须由当前进程地址空间加载。如果想要获取另一个已加载模块的文件路径,可以使用GetModuleFileNameEx()函数。

  strPath = strPath.substr(0, strPath.rfind("\\")+1);  从右边找/符号,取/和/左边的字符。

3.CIniFile  

ReadString  读取一个字符串值

ReadInt    读取一个整数值

WriteString   在指定的section,key处写入一个字符串值

WriteInt    在指定的section,key处写入一个整数值

load_ini_file  加载配置文件

GetPrivateProfileString  解析配置文件

4.assert    https://www.cnblogs.com/lvchaoshun/p/7816288.html

5.CreateMutex  CreateMutex是一个计算机函数,作用是找出当前系统是否已经存在指定进程的实例。如果没有则创建一个互斥体

返回值  Long,如执行成功,就返回互斥体对象的句柄;零表示出错。会设置GetLastError。如果返回的是一个有效句柄,但指定的名字已经存在,GetLastError也会设为ERROR_ALREADY_EXISTS,bInitialOwner的值将会被忽略。如果调用者限制了权限,GetLastError将会返回ERROR_ACCESS_DENIED,这个时候应该使用OpenMutex函数。
6. //测试日志

MYTRACE(LOG_LEVEL_INFO,"BaseStationService start.");  定义如下:

#define MYTRACE(ilevel, ...)  g_ClientLog.WriteLog(ilevel, __FILE__, __LINE__, __VA_ARGS__)

7.WaitForSingleObject    使线程处于等待状态,如等待某一事件的触发。

WaitForSingleObject函数用来检测hHandle事件的信号状态,在某一线程中调用该函数时,线程暂时挂起,如果在挂起的dwMilliseconds毫秒内,线程所等待的对象变为有信号状态,则该函数立即返回;如果超时时间已经到达dwMilliseconds毫秒,但hHandle所指向的对象还没有变成有信号状态,函数照样返回。

1 DWORD WINAPI WaitForSingleObject(
2 
3   HANDLE hHandle,                   //等待的触发句柄  ,  如前面说的Event的句柄
4 
5   DWORD dwMilliseconds             //等待多长时间,单位ms   如5000 则为5s   若为INFINITE表示无限等待
6 
7 );

8.// 先获取文件大小

fseek(fp, 0, SEEK_END);
long size = ftell(fp);
fclose(fp);

9.

 
  

        char szBuff[1024] = {0};
        va_list argptr;

       va_start(argptr, pszFmt);
            vsnprintf(szBuff, 1023, pszFmt, argptr);
            va_end(argptr);
va_start,函数名称,读取可变参数的过程其实就是在堆栈中,使用指针,遍历堆栈段中的参数列表,从低地址到高地址一个一个地把参数内容读出来的过程。

10.vsnprintf  是C语言库函数之一,属于可变参数。用于向字符串中打印数据、数据格式用户自定义。头文件是#include <stdarg.h>。
函数声明:
int _vsnprintf(char* str, size_t size, const char* format, va_list ap);
  1. char *str [out],把生成的格式化的字符串存放在这里.
  2. size_t size [in], str可接受的最大字符数   (非字节数,UNICODE一个字符两个字节),防止产生数组越界.
  3. const char *format [in], 指定输出格式的字符串,它决定了你需要提供的可变参数的类型、个数和顺序。
  4. va_list ap [in], va_list变量. va:variable-argument:可变参数

函数功能:将可变参数格式化输出到一个字符数组。

11.GetLocalTime  GetLocalTime是一个Windows API 函数,用来获取当地的当前系统日期和时间。

12.ReleaseMutex  ReleaseMutex是一种线性指令,具有释放线程拥有的互斥体的控制权。

互斥体实现了“互相排斥”(mutual exclusion)同步的简单形式(所以名为互斥体(mutex))。互斥体禁止多个线程同时进入受保护的代码“临界区”(critical section)。

13

    HANDLE                m_hEventStopThread;        //心跳线程事件句柄
    HANDLE              m_hLiveThread;            //心跳线程句柄
    bool                m_bLive;                //和总线连接标志  
//    CBuffPool           m_poolBuff;                //全局的简单的内存池

    int                    i_count_Msg;            //记录抛包数量

14.extern "C"

msgswitch动态库没有源代码,不需要了解    Init1  初始模块

15.::RegisterNotify  注册回调处理函数,属于MFC全局的函数,所以要加::

16.HANDLE     https://blog.csdn.net/baidu_18598927/article/details/60604959 

在windows环境中,句柄是用来标识项目的,这些项目包括:模块,任务,实例,文件,内存块,菜单,控制,字体,资源,包括图标,光标,字符串等,GDI对象,所括位图,画刷,元文件,调色板,画笔,区域,以及设备描述表句柄是用来标识(被应用程序所建立或使用的)对象的唯一整数,windows使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。

17.CMsgSwitchMgr::CMsgSwitchMgr( void )构造函数初始化

CMsgSwitchMgr::CMsgSwitchMgr( void )
    :m_hLiveThread(NULL)
    ,m_hEventStopThread(NULL)
    ,m_bLive(false)
{

}

构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。

18.CreateEvent  CreateEvent是一个Windows API函数。它用来创建或打开一个命名的或无名的事件对象。如果想为对象指定一个访问掩码,应当使用CreateEventEx函数。

HANDLE CreateEvent(
LPSECURITY_ATTRIBUTESlpEventAttributes,// 安全属性
BOOLbManualReset,// 复位方式
BOOLbInitialState,// 初始状态
LPCTSTRlpName // 对象名称
);
19._beginthreadex  创建线程
20._CRTIMP  C run time implement “C运行库的实现”的意思

 _ptiddata ptd; // 指向线程数据块

_ptiddata ptd;          //pointer to per-thread data 见注1
    uintptr_t thdl;         //thread handle 线程句柄
    unsigned long err = 0L; //Return from GetLastError()
    unsigned dummyid;    //dummy returned thread ID 线程ID号
--------------------- 
作者:MoreWindows 
来源:CSDN 
原文:https://blog.csdn.net/morewindows/article/details/7421759 
版权声明:本文为博主原创文章,转载请附上博文链接!

https://blog.csdn.net/morewindows/article/details/7421759

具体看上面这个,很详细。虽然我看得不大懂。

由上面的源代码可知,_beginthreadex()函数在创建新线程时会分配并初始化一个_tiddata块。这个_tiddata块自然是用来存放一些需要线程独享的数据。事实上新线程运行时会首先将_tiddata块与自己进一步关联起来。然后新线程调用标准C运行库函数如strtok()时就会先取得_tiddata块的地址再将需要保护的数据存入_tiddata块中。这样每个线程就只会访问和修改自己的数据而不会去篡改其它线程的数据了。因此,如果在代码中有使用标准C运行库中的函数时,尽量使用_beginthreadex()来代替CreateThread()。相信阅读到这里时,你会对这句简短的话有个非常深刻的印象,如果有面试官问起,你也可以流畅准确的回答了^_^。
---------------------
作者:MoreWindows
来源:CSDN
原文:https://blog.csdn.net/morewindows/article/details/7421759
版权声明:本文为博主原创文章,转载请附上博文链接!

21.https://blog.csdn.net/vict_wang/article/details/81288272?utm_source=blogxgwz0

private:
    static CBSApp*     m_pInstance;   //单实例对象指针

在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。

22. MYSQL*      m_db_ptr;

23.TLock

InitializeCriticalSection    https://blog.csdn.net/ccrrt/article/details/8099297

24.LiveThread函数:

WAIT_OBJECT_0  :表示你等待的对象(比如线程、互斥体)已的正常执行完成或完成释放。

25.querySQL

26.mysql_real_query

执行由query指向的SQL查询,它应该是一个length个字节的字符串。查询必须由一个单个的SQL语句组成。你不应该在语句后增加一个终止的分号(“;”)或\g。
对于包含二进制数据的查询,你必须使用mysql_real_query()而不是mysql_query(),因为二进制代码数据可能包含“\0”字符,而且,mysql_real_query()比mysql_query()更快,因为它对查询字符串调用strlen()。

mysql_store_result  成功调用mysql_query()后,mysql_store_result()能够返回NULL。

mysql_fetch_row()  mysql_fetch_row()也可以用来获取查询结果集,其区别在于函数的返回值不是一个字符串,而是一个数组。

mysql_num_rows  返回结果集中行的数量。

27.Json::Value  Json::Value是一种很重要的类型,可以代表任意类型。如int, string, object, array    

---恢复内容结束---

猜你喜欢

转载自www.cnblogs.com/liuliwei-leo/p/9854560.html
今日推荐