1.freopen( "CONOUT$","w",stdout);在操作系统中,命令行控制台(即键盘或者显示器)被视为一个文件,既然是文件,那么就有“文件名”。由于历史原因,命令行控制台文件在DOS操作系统和Windows操作系统中的文件名为"CON

win32程序启用控制台(控制台文件名:conout,conin,conerr) 
对stdin,stdout,stderr重新打开
    AllocConsole();
    freopen("conout$","w",stdout) ;
    printf("hello hplonline!-_-\n") ;
    std::cout<<"i'm cout"<<std::endl;
    freopen("conout$","w",stderr) ;
    std::cerr<<"i'm cerr"<<std::endl;

2.RegisterNotify,注册回调函数

操作是通过函数指针,把各个参数,赋值或者只返回0。

3.SetEvent  参考:线程中CreateEvent和SetEvent及WaitForSingleObject的用法

4.Basestation与VRS注册消息的不同:

Basestation:

VRS:

5.CreateMutex

CreateMutex()函数可用来创建一个有名或无名的互斥量对象,其函数原型为:

HANDLE CreateMutex(
LPSECURITY_ATTRIBUTESlpMutexAttributes, // 指向安全属性的指针
BOOLbInitialOwner, // 初始化互斥对象的所有者
LPCTSTRlpName // 指向互斥对象名的指针
);

6.取程序路径

CCommFunc::GetProgrammeDir

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

7. _tmain(int argc, _TCHAR* argv[])

_tmain 是高版本的微软 VC 编译器才有的,你查看一下 _tmain 的定义,会发现其实它和 main 是一样的。你把 _tmain 改为 main,不会有问题。相反,你如果在低版本的 VC 编译器,比如VC6.0中将 main 改为 _tmian ,就会出错。
参数的话,argc 表示命令行参数的个数,argv 是字符串数组,存储命令行参数。比如你写的程序是test.exe,你在命令行中输入“test.exe /r /s”,那么argc 就等于 3,argv[0] 就是 “test.exe”,argv[1]就是“/r",argv[2] 就是“/s”。

8.SetEvent

设置事件的状态为有标记,释放任意等待线程。

WaitForSingleObject()等待,直到参数所指定的OBJECT成为发信号状态时才返回,OBJECT可以是EVENT,也可以是其它内核对象。 当你创建一个线程时,其实那个线程是一个循环,不像上面那样只运行一次的。这样就带来了一个问题,在那个死循环里要找到合适的条件退出那个死循环,那么是怎么样实现它的呢?在Windows里往往是采用事件的方式,当然还可以采用其它的方式。在这里先介绍采用事件的方式来通知从线程运行函数退出来,它的实现原理是这样,在那个死循环里不断地使用WaitForSingleObject函数来检查事件是否满足,如果满足就退出线程,不满足就继续运行。当在线程里运行阻塞的函数时,就需要在退出线程时,先要把阻塞状态变成非阻塞状态,比如使用一个线程去接收网络数据, [1]  同时使用阻塞的SOCKET时,那么要先关闭SOCKET,再发送事件信号,才可以退出线程的。

9.该进程或线程自上一个步骤以来已更改

修改了这一项,以后改回来:要求源文件与原始版本完全匹配

10._threadstartex

函数_threadstartex(注意不是线程函数), 其参数是线程数据块(LPVOID)ptd

 _threadstartex的功能是

1.将新建线程与内存数据块关联(__fls_setvalue,该函数是操作系统函数,即所谓的线程局部存储(Thread Local Storage, TLS))

2.调用_callthreadstartex来执行及终结真正的线程函数

此函数所做的内容:

<1>  新线程从RtlUserThreadStart开始执行,转到_threadstartex

<2>  _tiddata 类型数据块被作为参数传递给_threadstartex

<3>  TlsSetValue是个操作系统函数,它负责将一个线程跟一个值联系起来

<4>_callthreadstartex被调用,线程函数被在这个函数中调用
---------------------
作者:eskimoer
来源:CSDN
原文:https://blog.csdn.net/ddupd/article/details/27309725
版权声明:本文为博主原创文章,转载请附上博文链接!

11._callthreadstartex函数

<1>  从TLS中获取线程相关的数据块

<2>在_callthreadstartex中维护一个SHE帧,负责运行库相关事宜

<3>从数据库获取线程函数以及参数,并且调用线程函数

<4>从线程或者进程退出。

12.template<typename T>

13.InitializeCriticalSection

函数功能初始化一个临界资源对象。“临界区”CCriticalSection [1]  是临界资源对象指针。该函数无返回值。单进程的各个线程可以使用临界资源对象来解决同步互斥问题,该对象不能保证哪个线程能够获得到临界资源对象,该系统能公平的对待每一个线程。

DeleteCriticalSection

译为对关键节对象的指针。先前必须已将该对象初始化与InitializeCriticalSection函数中。

EnterCriticalSection

多个线程操作相同的数据时,一般是需要按顺序访问的,否则会引导数据错乱,无法控制数据,变成随机变量。为解决这个问题,就需要引入互斥变量,让每个线程都按顺序地访问变量。这样就需要使用EnterCriticalSection和LeaveCriticalSection函数。

14.自动锁

class ATLock
{
public:
    ATLock(TLock* pTLock)
    {
        m_pTLock = pTLock;

        m_pTLock->Lock();
    };

    ATLock(TLock& lock)
    {
        m_pTLock = &lock;

        m_pTLock->Lock();
    };

    virtual ~ATLock()
    {
        m_pTLock->UnLock();
    };

protected:

    TLock* m_pTLock;
};15.
class IGGAData
{
public:
    IGGAData(CVRSProcMgr *pVRSProcMgr);
    virtual ~IGGAData(void);

    ;

    ;

    ;

    virtual void Init(string &name, int iUserId);

protected:
    string    m_GGAData;            //原始数据存储
    string    m_name;                //用户名
    int       m_iUserId;
    TLock     m_lock;
    TLock      m_datalock;            //解码完后的数据

    CVRSProcMgr*    m_pProcMgr;
    int             m_BSIdList;
    USERINFO1 *     m_userInfo;
    time_t          m_LastUpdTm;   //用户数据最后更新的时间,用来CHECK用户是否在线

};

16.

CMSG* pMsg = m_qMSG.Pop();
Pop函数:

    /*******************************************************************************
    * 函数名称  : Pop
    * 函数描述  : 从队列中取一个任务
    * 输入参数  : N/A
    * 输出参数  : N/A
    * 返回值    : CTask*  任务对象指针
    * 备注      : 多线程操作,需要加锁
    * 修改日期     修改人   修改内容
    * -----------------------------------------------
    * 2012/11/07    3.0   新建
    *******************************************************************************/
    T Pop()
    {
        ATLock lock(this);

        if (m_listTask.empty()) //队列为空返回NULL,防止front未定义
        {
            return NULL;
        }

        T pTask = m_listTask.front();

        m_listTask.pop_front();

        return pTask;
    }
17. it->second->ProcData();是什么意思
    for (tUserList::iterator it = m_mapUserList.begin();it != m_mapUserList.end();it++ )
    {
        it->second->ProcData();
    }

(*it).first会得到key,

(*it).second会得到value。

https://blog.csdn.net/tcx1992/article/details/80928790

18.FreeLibrary

意思是释放指定的动态链接库。

18.当前时间变成字符串,MAX_PATH=260

SYSTEMTIME t_logout;
    GetLocalTime(&t_logout);
    string t_sLogOut;
    char LogOutTime[MAX_PATH];
    sprintf(LogOutTime,",%d-%d-%d,",t_logout.wHour , t_logout.wMinute , t_logout.wSecond);
    t_sLogOut = LogOutTime;
    /*t_str += " LogoutTime:";*/
    t_str += t_sLogOut;

19.配置文件相关

)
        {
            getline(rf,strBuf);
            //读取跳秒
            )
            {
                r[] = ;
                vector<string> strLeapSec;
                int n = StringSplitArray(strBuf,',',strLeapSec);
                )
                {
                    printf("\r\n");
                    printf("\r\n");
                    printf("\r\n");
                    printf("未读到跳秒参数,请检查配置文件\r\n");
                    continue;
                }
                LeapSecond = atoi(strLeapSec.at().c_str());
                printf("\r\n");
                printf("\r\n");
                printf("\r\n");
                printf("跳秒读取成功----------------------------%d\r\n",LeapSecond);
                continue;
            }
}

20.readLock

typedef boost::shared_mutex rwmutex;
typedef boost::shared_lock<rwmutex> readLock;
typedef boost::unique_lock<rwmutex> writeLock;
21.fopen_serrno_t fopen_s( FILE** pFile, const char *filename, const char *mode );
    FILE *fp;
    CString strfile;
    strfile.Format("SatEle\\Ele_%d.txt",i_index);
    errno_t err = fopen_s(&fp,LPCTSTR(strfile),"at");
    if(err == 0)
    {
        for(int i = 0;i < tempPPPData->gpsnum;i++)
        {
            fprintf_s(fp,"%d,%d:%d,%.3f\r\n",tempPPPData->gpsinfo[i]->PRN,tempPPPData->gpsinfo[i]->PRN,tempPPPData->gpssecond,tempPPPData->gpsinfo[i]->Ele);
        }
        for(int i = 0;i < tempPPPData->bdsnum;i++)
        {
            fprintf_s(fp,"%d,%d:%d,%.3f\r\n",tempPPPData->bdsinfo[i]->PRN,tempPPPData->bdsinfo[i]->PRN,tempPPPData->gpssecond,tempPPPData->bdsinfo[i]->Ele);
        }
        fclose(fp);
    }
LPCTSTR

LPCTSTR用来表示你的字符是否使用UNICODE, 如果你的程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串。

L表示long指针 这是为了兼容Windows 3.1等16位操作系统遗留下来的,在win32中以及其他的32位操作系统中, long指针和near指针及far修饰符都是为了兼容的作用。没有实际意义。P表示这是一个指针。C表示是一个常量。T表示在Win32环境中, 有一个_T宏。STR表示这个变量是一个字符串。

22.#include <process.h>

process.h 是包含用于和宏指令的作用声明与螺纹和过程一起使用的C标头文件。 标头文件的作用是由二者之一定义的 ANSI/ISO C 标准或 POSIX、多数C编译器 DOS, 窗口3.1x, Win32, OS/2Novell NetWare或 DOS职能在他们的C程序库里。多线程相关的时候就需要include <process.h>提供了两个对多线程进行支持的函数,即线程的创建和终结没有对线程挂起和恢复进行操作的函数,通常,这两项功能使用win32 api完成。

23.排序。


* 函数名称 : SortData
* 函数描述 : 按照卫星编号大小进行排序

void CBaseInfo::SortData(SatInfoPointChain &tempSatInfoChain)
{
    int num_sat = tempSatInfoChain.size();
    ;i < num_sat;i++)
    {
        ;j < (num_sat - i -);j++)
        {
            ]->PRN )
            {
                PPPsatinfo *tempSatInfo = new PPPsatinfo;
                *tempSatInfo = *(tempSatInfoChain[j]);
                *(tempSatInfoChain[j]) = *(tempSatInfoChain[j+]);
                *(tempSatInfoChain[j+]) = *tempSatInfo;
                delete tempSatInfo;
            }
        }
    }
}

VRSProcess(一)的更多相关文章

  1. VRSProcess(二)

    1._beginthreadex再谈 Windows操作系统提供了这样的一种解决方案——每个线程都将拥有自己专用的一块内存区域来供标准C运行库中所有有需要的函数使用.而且这块内存区域的创建就是由C/C ...

随机推荐

  1. unity之定制脚本模板

    1.unity的脚本模板        新版本unity中的C#脚本有三类,第一类是我们平时开发用的C# Script:第二类是Testing,用来做单元测试:第三类是Playables,用作Time ...

  2. split函数和merge函数

    split函数的主要功能是把一个彩色图像分割成3个通道,方便进一步的图像处理,具体说明如下: split Divides a multi-channel array into several sing ...

  3. [转]Extending the User Interface in Outlook 2010

    本文转自:https://msdn.microsoft.com/en-us/library/office/ee692172%28v=office.14%29.aspx#OfficeOLExtendin ...

  4. 【转】实现Sqlite datediff日期时间相减的方法

    对sqlite既恨又爱,在小项目里,用sqlite开发起来非常方便,效率足够用.美中不足的是sqlite精简了些功能及相关函数.如存储过程,datediff,不支持并发写入及远程访问(或许有些高手说这 ...

  5. Java:使用DOM4j来实现读写XML文件中的属性和元素

    DOM4可以读取和添加XML文件的属性或者元素 读取属性: public static void ReadAttributes() throws DocumentException { File fi ...

  6. java工具类-交易码

    /** * 功能描述:交易码 * */ public class TransCode { //登录 public static final String LOGIN="A001"; ...

  7. Java转换Word文件到PDF文件

    使用Docx4j将Word文件转换为PDF文件: public static void convertDocxToPDF(String docxFilePath, String pdfPath) th ...

  8. js 中使用 #region #endregion

    vs 和 vs code 都是可以支持 js 使用 #region 折叠代码的:code 我就不说了 同理vs 的: 首先下载 vs 插件,插件路径:https://archive.codeplex. ...

  9. 设计模式--单例模式(学习Learning hard大神笔记实践)

    根据大神博客园中的文章,自己亲手敲了一遍,对每个解说点都自己动手进行实践,收获颇丰,谢谢Learning hard大神,原文地址http://www.cnblogs.com/zhili/p/Desig ...

  10. Stream grouping-storm的流分组策略

    A stream grouping tells a topology how to send tuples between two components. Remember, spouts and b ...