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字符串。
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(一)的更多相关文章
-
VRSProcess(二)
1._beginthreadex再谈 Windows操作系统提供了这样的一种解决方案——每个线程都将拥有自己专用的一块内存区域来供标准C运行库中所有有需要的函数使用.而且这块内存区域的创建就是由C/C ...
随机推荐
-
教你一招:Word中的文字转换成表格,把表格转换成文字
在使用office软件时,常常会在Word中加入表格,这时候我们一般想到的是,建立表格,然后一格一格的填写;或者用Excel表格制作在复制到Word文档中.其实在Word中就可以将文本文档转换成电子表 ...
-
Linux下man手册使用
在 linux 环境下,为了查看一下 free 函数的原型,执行 man free 命令,发现显示结果为系统的 free 命令帮助,而不是库文件中的 free 函数帮助.查阅了一下,发现 man 的使 ...
-
Hibernate 随记(数据库映射流程)
ORM:Object/Relationship Mapping 对象/关系映射 实现流程: 1.项目中导入Hibernate相关类包并创建配置文件.Hibernate.cfg.xml(可 ...
-
POJ 2947	 Widget Factory (高斯消元 判多解 无解 和解集 模7情况)
题目链接 题意: 公司被吞并,老员工几乎全部被炒鱿鱼.一共有n种不同的工具,编号1-N(代码中是0—N-1), 每种工具的加工时间为3—9天 ,但是现在老员工不在我们不知道每种工具的加工时间,庆幸的是 ...
-
SAP GUI个性化设置
大概从GUI730开始,GUI品牌化一直不被默认支持,在GUI设置选项里处于灰色状态,如下图: 不过用户还是可以修改注册表的方式来进行修改,让它可以设置! 首先运行Regedit,在目录:HKEY_L ...
-
.net委托链
委托链可以增加方法,可以移除方法,如果是无返回值的方法,我们把它们都绑定到一个委托上面的话,直接调用,那么调用此委托就会依次调用其中的方法:但是如果是多个有返回值的委托链,如果我们不采用特殊手段,直接 ...
-
sublime text 3 开启卡顿(win7)解决办法
启动sublime3,ctrl+~打开命令窗口,输入以下 { "update<em>check": false, "font</em>size&q ...
-
Microsoft Dynamics CRM 2011 配置好的IFD环境 怎么制作证书?
一.CRM2011 IFD怎么制作证书? 配置好的IFD环境里面:打开开始—运行 1.输入: mmc(微软管理控制台) 出现: 2. 出现: 3.添加/删除管理单元,如图: 4.添加证书 5. 6. ...
-
[转] 在linux下使用Terminator
Ubuntu自带的终端是gnome-terminal,虽然能用但是不能支持屏幕分割和选择复制等功能,于是换用terminator作为默认终端. 安装 sudo apt-get install term ...
-
django restframwork教程之Request和Response
从这一篇文章开始,我们会覆盖整个REST framwork框架的核心,接下来让我们介绍一些基础的构建块 Request 对象 REST framework 引入了一个扩展HttpRequest的请求对 ...