VRSProcess(一)
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 ...
随机推荐
- unity之定制脚本模板
1.unity的脚本模板 新版本unity中的C#脚本有三类,第一类是我们平时开发用的C# Script:第二类是Testing,用来做单元测试:第三类是Playables,用作Time ...
- split函数和merge函数
split函数的主要功能是把一个彩色图像分割成3个通道,方便进一步的图像处理,具体说明如下: split Divides a multi-channel array into several sing ...
- [转]Extending the User Interface in Outlook 2010
本文转自:https://msdn.microsoft.com/en-us/library/office/ee692172%28v=office.14%29.aspx#OfficeOLExtendin ...
- 【转】实现Sqlite datediff日期时间相减的方法
对sqlite既恨又爱,在小项目里,用sqlite开发起来非常方便,效率足够用.美中不足的是sqlite精简了些功能及相关函数.如存储过程,datediff,不支持并发写入及远程访问(或许有些高手说这 ...
- Java:使用DOM4j来实现读写XML文件中的属性和元素
DOM4可以读取和添加XML文件的属性或者元素 读取属性: public static void ReadAttributes() throws DocumentException { File fi ...
- java工具类-交易码
/** * 功能描述:交易码 * */ public class TransCode { //登录 public static final String LOGIN="A001"; ...
- Java转换Word文件到PDF文件
使用Docx4j将Word文件转换为PDF文件: public static void convertDocxToPDF(String docxFilePath, String pdfPath) th ...
- js 中使用 #region #endregion
vs 和 vs code 都是可以支持 js 使用 #region 折叠代码的:code 我就不说了 同理vs 的: 首先下载 vs 插件,插件路径:https://archive.codeplex. ...
- 设计模式--单例模式(学习Learning hard大神笔记实践)
根据大神博客园中的文章,自己亲手敲了一遍,对每个解说点都自己动手进行实践,收获颇丰,谢谢Learning hard大神,原文地址http://www.cnblogs.com/zhili/p/Desig ...
- Stream grouping-storm的流分组策略
A stream grouping tells a topology how to send tuples between two components. Remember, spouts and b ...