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 ...
随机推荐
- 前端JS校验银行卡卡号和身份证号码(附ES6版方法)
1.银行卡卡号校验方法. function luhnCheck(bankno) { var lastNum = bankno.substr(bankno.length - 1, 1); //取出最后一 ...
- IOS第三方之SVProgressHUD
这个第三方和MBProgressHUD差不多,也挺简单的. // // ViewController.m // ProgressHUD // // Created by City--Online on ...
- Visual Basic了解
Visual Basic是一种由微软公司开发的结构化的.模块化的.面向对象的.包含协助开发环境的事件驱动为机制的可视化程序设计语言.这是一种可用于微软自家产品开发的语言.它源自于Basic编程语言.V ...
- Asp.Net 天气 WebService 使用
本文使用Asp.Net (C#)调用互联网上公开的WebServices(http://www.webxml.com.cn/WebServices/WeatherWebService.asmx)来实 ...
- 斐波那契堆(Fibonacci heap)原理详解(附java代码实现)
前言 斐波那契堆(Fibonacci heap)是计算机科学中最小堆有序树的集合.它和二项式堆有类似的性质,但比二项式堆有更好的均摊时间.堆的名字来源于斐波那契数,它常用于分析运行时间. 堆结构介绍 ...
- Python爬虫初识
本文章是对网易云课堂中的Python网络爬虫实战课程进行总结.感兴趣的朋友可以观看视频课程.课程地址 爬虫简介 一段自动抓取互联网信息的程序 非结构化数据 没有固定的数据格式,如网页资料. 必须通过E ...
- 从项目中学习HTML+CSS
最近由于工作原因以及自己的懈怠,已经很久都没有更新过博客了.通过这段时间,我发现坚持一件事情是真的很难,都说万事开头难,但是在放弃这件事上好像开头了后面就顺理成章的继续下去了.中间即使不怎么情愿也在努 ...
- JS实现的数组全排列输出算法
本文实例讲述了JS实现的数组全排列输出算法.分享给大家供大家参考.具体分析如下: 这段js代码对数组进行全排列输出,改进了一些老的代码 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来, ...
- dnspod域名解析设置
time: 2016-01-8 10:30 因为我的博客是用Github page搭建的,所以要把域名和Github_name.github.io的URL联系起来.本人实在小白一个,就纪录一下 ...
- Date()对象的设置与解析
怎么获取当前时间? 怎么给Date对象设置特定时间? 将Date对象解析为毫秒数? 将Date对象解析为日月年?获取小时/分钟/秒? 直接new Date()新建对象,可以获取当前时间的Date对象: ...