学习、成长之路

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  16 Posts :: 0 Stories :: 27 Comments :: 0 Trackbacks

常用链接

留言簿

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

最近做一个项目,需要记录系统里每个进程访问的IP及Port,然后提交到服务端进行分析,我的思路是用一个缓存文件记录所有进程访问网络的信息,然后在主程序中提取记录再提交。
这里面涉及到多进程访问同一个缓存文件的同步问题,于是封装了下面这个类,自我感觉良好,拿出来和大家分享 :)

* 使用类似于环形链表的机制来保证运行效率


测试程序如下:
 1 #include "RecodeLog.cpp"
 2 #include <stdio.h>
 3 #pragma pack(1)
 4 // 测试用结构,可自定义,结构中不应该包涵指针类型
 5 typedef struct _tagTestInfo
 6 {
 7     DWORD nTest;
 8     char szTest[32];
 9 }TESTINFO, *PTESTINFO;
10 #pragma pack()
11 
12 ULONG WINAPI TestThread(PVOID pParam)
13 {
14     TESTINFO ti; 
15     CRecodeLog<TESTINFO> *prl = new CRecodeLog<TESTINFO>("TestRL""c:\\trl.dat"1000);
16     for (int i = 0; i < 100; i++)
17     {
18         ti.nTest = i;
19         itoa(i, ti.szTest, 10);
20         // 可在任意进程或线程中调用该方法,不用考虑同步问题
21         prl->AddLog(&ti);    // 写入到缓冲文件中
22     }
23     delete prl;
24     return 0;
25 }
26 
27 int main(int argc, char* argv[])
28 {
29     // 开两个线程,每个线程增加100条记录
30     HANDLE hThread, hThread2;
31     hThread = CreateThread(NULL, NULL, TestThread, NULL, NULL, NULL);
32     hThread2 = CreateThread(NULL, NULL, TestThread, NULL, NULL, NULL);
33     WaitForSingleObject(hThread, INFINITE);
34     WaitForSingleObject(hThread2, INFINITE);
35     CloseHandle(hThread);
36     CloseHandle(hThread2);
37 
38     
39     CRecodeLog<TESTINFO> *prl = new CRecodeLog<TESTINFO>("TestRL""c:\\trl.dat"1000);
40     TESTINFO getTi; 
41     int ncount = 0;
42     while (prl->GetTop(&getTi))    // 取最顶部的缓存记录
43     {
44         printf("%d--%s\n", getTi.nTest, getTi.szTest);
45         prl->DelTop();    //    删除最顶端的缓存记录
46         ncount++;
47     }
48     printf("%d\n", ncount);
49     delete prl;
50 
51     return 0;
52 }

从运行结果可以看到主线程读取到的记录是乱序的,但没有丢失的记录。。

下载示例代码/Files/sToa/TestCache.rar
posted on 2009-08-16 13:41 sToa 阅读(1742) 评论(1)  编辑 收藏 引用 所属分类: VC

Feedback

# re: 封装一个跨进程缓存类 2009-08-19 14:44 彩铃
离开的风格  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理