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 ...
随机推荐
- webbrowser打开新窗口事件+=
测试可用: private void SaveSnapshot_Click(object sender, EventArgs e) { this.webBrowser1.Navigate(txturl ...
- HTTP报文(面试会问开发时常用的报文头格式)
(本文的解释是完整的,ajax把很多东西封装了) HTTP有两类报文:请求报文和响应报文. HTTP请求报文 一个HTTP请求报文由请求行(request line).请求头部(header).空行和 ...
- [转]Gridview实现多列排序,并显示图标
本文转自:http://blog.csdn.net/gmjinrong/article/details/4516301 GridView实现支持多列排序,并显示升.降序图标上网找了很多资料参考才解决了 ...
- resize定义元素尺寸大小
为了增强用户体验,CSS3增加了很对的新属性,其中一个重要的属性就是resize,它允许用户通过拖动的方式改变元素的尺寸,到目前为止,主要用于可以使用overtflow属性的任何容器元素中 resiz ...
- Css3盒子尺寸
box-sizing属性 用来改变盒模式中的宽度和高度默认的计算方式. box-sizing: 1.content-box(默认值): 宽度和高度只包含内容区域 2.border-box: 宽度和高度 ...
- secureCRT的文件上传技巧
现在我们经常会习惯性的使用windows系统,但现在开发项目和维护中经常都在使用linux服务器,以为它的性能更强.更精简. 学习大数据的同志们和维护后端的同志们,推荐一下secureCRT软件,用起 ...
- dubbo的重试机制
对dubbo熟悉的人对下面的配置一定不会陌生: <dubbo:reference id="xxxx" interface="xx" check=" ...
- npm saveError ENOENT: no such file or directory
1.报错情况 在执行npm install xxx时,出现如下:npm WARN saveError ENOENT: no such file or directory, open '/nodetes ...
- SpringCloud Eureka(注册中心集群)
多个注册中心,其实用不同的配置对应 不同的端口号注册就行了. 注册中心自己也是个服务,看看之前的单个注册中心是怎么样的呢? server: port: 8888 # 服务端口eureka: insta ...
- css-扩展选择器
(1)关联选择器 <div><p>aaaaaaaaaaaa</p></div> * 设置div标签里面p标签的样式,嵌套标签里面的样式 div p{ b ...