socketref,再见!高德

https://github.com/adoggie

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  246 Posts :: 4 Stories :: 312 Comments :: 0 Trackbacks

常用链接

留言簿(54)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

#

#ifndef _BT_THREAD_H
#define _BT_THREAD_H

#include <windows.h>

class btworkThread{
public:
    btworkThread( void(*entry)(btworkThread* ,void*),void* user){        
        _entry = entry;        
        _param = user;
        _thandle = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)btworkThread::run,user,NULL,&_tid);
    }
    void    stop(){
        _loop = false;
    }
    void    wait(){
        while(!_end){
            Sleep(20);
        }
        Sleep(20);  // ensure that thread has terminated
    }
    void    stopAndWait(){
        stop();wait();
    }
    bool    loop(){
        return _loop;
    }
    void    code_begin(){
        _loop = true; _begin = true;_end=false;
    }
    void    code_end(){
        _loop = false; _begin = false;_end=true;
        CloseHandle(_thandle);
    }
protected:
    static void    run(btworkThread* thread){
        thread->_entry(thread,thread->_param);
    }
private:
    volatile bool    _loop,_begin,_end;
    void (*_entry)(btworkThread* ,void*);
    void*    _param;
    DWORD    _tid;
    HANDLE    _thandle;
};
posted @ 2007-02-23 22:47 放屁阿狗 阅读(683) | 评论 (3)编辑 收藏

    #include "btMutex.h"

template <typename T>
class SmartHandlePtr{
    struct Handle{
        Handle(){
            ptr = NULL;
            cnt = 0;
        }
        void*    ptr;
        int        cnt;
        btLock    lock;
        void    inc(){
            btScopeLock sl(lock);
            cnt++;
        }
        void    dec(){
            btScopeLock sl(lock);
            cnt--;
        }
    };
public:
    SmartHandlePtr(const T* p){
        _ph = new Handle;
        _ph->ptr =(void*) p;
        _ph->inc();
    }

    ~SmartHandlePtr(){
        if( _ph ){
            _ph->dec();
            if( _ph->cnt==0){
                T* p;
                p = (T*)_ph->ptr;
                if( p ){
                    delete p;
                }
                delete _ph;
            }           
        }
    }

    SmartHandlePtr(const SmartHandlePtr& shp){
        if( _ph ){
            _ph->dec();
            if( _ph->cnt==0){
                T* p;
                p = (T*)_ph->ptr;
                if( p){
                    delete p;
                }
                delete _ph;
            }           
        }
        _ph = _ph;
        _ph->inc();
    }
    bool operator==(const T* p) {
        return _ph->ptr == p;
    }
    bool operator==(const SmartHandlePtr& shp){
        return _ph == shp._ph;
    }

    T* operator->(){
        return (T*)_ph->ptr;
    }

    T* get(){
        if( _ph && _ph->ptr){
            return (T*)_ph->ptr;
        }
        return NULL;
    }

private:
    Handle*    _ph;
};
posted @ 2007-02-23 22:39 放屁阿狗 阅读(1188) | 评论 (0)编辑 收藏

我的小狗在2006.8.21出世了,这个世界除了干活之外多了点活跃的气息。
小狗不好带,但也尽量去尝试做父亲的责任
posted @ 2006-09-03 11:22 放屁阿狗 阅读(167) | 评论 (0)编辑 收藏

我记得有个Omni的类库中有对线程的封装,看了看,不爽
ACE也有线程类,不过要用必须连接其庞大的ace.so 不爽
ICE也有,不过太简单
还是自己写:
哈哈,支持win32和posix接口
这个咚咚已经在好多地方用过,希望提点

 1 
 2 #ifndef _THREAD_H
 3 #define _THREAD_H
 4 
 5 #include "nv_vartype.h"
 6 #include "nvplat.h"
 7 
 8 #ifdef WIN32
 9 #include <windows.h>
10 typedef HANDLE NVHANDLE;
11 
12 #define NVCreateThead(handle,proc,param,bret) {\
13                                                 DWORD thrid;\
14                                                 handle = CreateThread(0,0,(LPTHREAD_START_ROUTINE)proc,(void*)param,0,&thrid);\
15                                                 bret  = true;\
16                                               }
17 #define THREAD_DETACH
18 
19 #endif
20 
21 #ifdef _UNIX
22 typedef pthread_t NVHANDLE;
23 
24 #define NVCreateThead(handle,proc,param,bret)    {\
25                                                  int ret;\
26                                                  ret= pthread_create(&handle,0,proc,param);\
27                                                  bret= (ret!=0)?false:true;\
28                                                 }
29 #define THREAD_DETACH            pthread_detach(pthread_self());
30 #endif
31 
32 
33 typedef void *(*THREAD_PROC)(void *param);
34 
35 
36 class NVThread{
37 public:
38     enum STATUS{
39         RUNNING,
40         STOP
41     };
42     enum WHERE{
43         HEAD,
44         TAIL
45     };
46     NVThread();
47     ~NVThread();    
48     bool        Create(void *param=0);
49     void        Terminate();
50     void        Wait();
51     STATUS         GetStatus();
52     void         SetStatus(STATUS status);
53     WHERE         GetWhere();
54     void         SetWhere(WHERE where);
55     static void *     NewThread(void *);
56     virtual void     Run(void *param);
57 protected:    
58     NVHANDLE    _thrhand;
59     STATUS        _status;
60     WHERE        _where;
61     void *        _param;
62     void *        _void;
63 };
64 
65 #define  THREAD_START(t)    (t).SetStatus(RUNNING); (t).SetWhere(HEAD);
66 #define  THREAD_END(t)    (t).SetStatus(STOP); (t).SetWhere(TAIL);THREAD_DETACH;
67 #define  THREAD_CONTINUE(t) ((t).GetStatus()== NVThread::RUNNING)?true:false
68 
69 #define THREAD_START_T    THREAD_START(*this)
70 #define THREAD_END_T    THREAD_END(*this)
71 #define THREAD_CONTINUE_T THREAD_CONTINUE(*this)
72 
73 
74 
75 #include "nvthread.i"
76 
77 #endif
78 //--
79 
 1 
 2 
 3 #include "nvthread.h"
 4 
 5 inline  
 6 NVThread::NVThread(){
 7     _where = TAIL;
 8     _status = STOP;
 9     
10 }
11 inline  
12 NVThread::~NVThread(){
13 }
14 
15 inline  
16 bool NVThread::Create(void *param){
17     bool ret;
18     NVCreateThead(_thrhand,NVThread::NewThread,this,ret);
19     if( ret){ //--线程创建成功,等待线程运行状态改变
20         while( GetStatus()!=NVThread::RUNNING){
21             SLEEP_MSEC(100);
22         }
23     }
24     return ret;
25 }
26 
27 inline 
28 void NVThread::Terminate(){
29     _status = STOP;
30 }
31 
32 inline 
33 void * NVThread::NewThread(void *param){
34     NVThread *thread = (NVThread *)param;
35     THREAD_START(*thread);
36     thread->Run(thread->_param);
37     THREAD_END(*thread);
38     return 0;
39 }
40 
41 inline 
42 void NVThread::Run(void *param){
43 /*    while(THREAD_CONTINUE(*this)){
44         Sleep(100);
45     }    */
46 }
47 
48 inline 
49 void NVThread::Wait(){
50     while(GetWhere()!=TAIL){
51         SLEEP_MSEC(100);
52     }
53 }
54 
55 inline 
56 NVThread::STATUS NVThread::GetStatus(){
57     return _status;
58 }
59 
60 inline 
61 void NVThread::SetStatus(STATUS status){
62     _status = status;
63 }
64 
65 inline 
66 NVThread::WHERE NVThread::GetWhere(){
67     return _where;
68 }
69 
70 inline 
71 void NVThread::SetWhere(WHERE where){
72     _where = where;
73 }
74 
75 
76 
77 

派生线程类实现分派外部全局函数
 1
 2#ifndef _THREADOBJECT_H
 3#define _THREADOBJECT_H
 4
 5/*
 6    file:    nvthreadobj.h
 7    class:     NVThreadObject
 8    desc:    控制外部线程行为
 9*/

10
11
12#include "nvthread.h"
13
14class NVThreadObject:public NVThread{
15public:
16    void     Run(void *param){
17        _threadproc(param);    
18    }

19    bool    Create(THREAD_PROC proc,void *param=0){
20        _threadproc = proc;
21        _param = param;
22        return NVThread::Create();
23    }

24protected:    
25    THREAD_PROC    _threadproc;
26}
;
27#endif
posted @ 2006-03-11 00:24 放屁阿狗 阅读(518) | 评论 (0)编辑 收藏

准备辞职到通知领导不过2,3天的功夫
实在不想去做实施那个ultra的破东西,整日跟客户打交道,处人际关系小心谨慎的过活,一呆就是一整天。这种日子我定是受不了。
领导给我分析就业形势,就是劝我继续留下,说是做行业实施比做开发吃香,做开发是吃青春饭的。
呵呵,我可不是这么认为,只有开发水平上不去而被淘汰的人才会有这种想法。
做开发,做编程一直是我的兴趣。工作带有自己的兴趣便是工作就不是一种痛苦的责任了,我每天7小时睡眠,路上花2小时,吃饭加上其他时间一天有14小时左右是在computer之前。
喜欢研究新的技术,看到或者听到有某些技术出现,我都回去花大量时间去研究和编码实践,纵向横向比较其优劣点,然后对其不足之处去修改或者自己重新实现自己的版本,结果就是使自己的眼睛越来越酸疼,老婆越来越多的唠叨。
我一直鼓励别人多接触开源社区,多看看一些软件代码,吸收其精髓来强身健体。
有点扯远了,继续说我的工作。
领导同意我的辞职,只是要求把登记公司的开发工作做完。
工作其实也是简单,在异构的系统环境中开发一些辅助性的软件,大概8,9个之多。
所以我现在还是继续呆在公司,完成交待给我的工作。到今天,所有的开发已经差之无多了,因为我用了python(现在真是喜欢它,数据库,用户接口,分布式应用系统(ICE) 无所不能),过几天估计就要去现场调试。
其实我也挺喜欢这个工作环境,虽然刚刚被另外一家公司兼并,虽然跑了很多的人,虽然不加工资,虽然......
接着我就得考虑找工作的问题,头又开始有点大了。。。
posted @ 2006-03-11 00:09 放屁阿狗 阅读(317) | 评论 (0)编辑 收藏

现在发现自己面试的心态很不好,不喜欢别人问东问西,问一些无关紧要的事情。讨厌问一些肤浅的技术,比如老是有人问:"啊,了解多线程技术吗","写过socket网络通信程序吗?"....
现在碰到面试的情况,我很是讨厌让我介绍自己,如何介绍,现在自己也不清楚。
其实只要看我的工作简历和要求的工资待遇就可以看出我的能力了的,我是这样想的。
一次去面试,等了10分钟,谈了10分钟,说是要等总监定夺,靠!骗我老远来面试,很是不爽
期待面试,我想找份收入高点的工作,毕竟现在这点钱只能维持养家糊口的水平,生活家庭的责任感越来越强烈;可是到了面试时候却是打不起任何精神。
posted @ 2006-03-02 01:10 放屁阿狗 阅读(349) | 评论 (0)编辑 收藏

vnc可是好东西,对linux的支持可是非常之优秀,比起在windows上要表现的好的多
vnc采用c/s架构,其通信机制没有多少的复杂,但是对编写windows版本服务端代码的开发者对windows api驾驭的能力倒是有点佩服
 其实现技术:
      win-hook + event-simulate + gdi-bitmap-capture(delay send) + libjpeg + socket
研究完了其工作机制之后我也写了一个类vnc的服务器和客户端程序,运行之后发现在频率很高的bitmap捕获到libjpeg的压缩的过程很耗cpu资源,还有就是虽然采用jpeg压缩(如在做视频监控时采用的mjpeg设备一样)还是于码流太大,跟vnc比较了以下好像还是有一点的差距,毕竟不是当作一个正式的咚咚去做的,等有时间之后或者某人倡议之下继续完善它吧!
posted @ 2006-03-02 01:00 放屁阿狗 阅读(3821) | 评论 (21)编辑 收藏


  1 #include <stdio.h>
  2 
  3 #include "jpeglib.h"
  4 
  5 void
  6 JpegInitDestination(j_compress_ptr cinfo)
  7 {
  8 }
  9 
 10 static boolean
 11 JpegEmptyOutputBuffer(j_compress_ptr cinfo)
 12 {    
 13     return TRUE;
 14 }
 15 
 16 static void
 17 JpegTermDestination(j_compress_ptr cinfo)
 18 {
 19 //    jpegDstDataLen = jpegDstBufferLen - jpegDstManager.free_in_buffer;
 20 }
 21 
 22 /**
 23     Raw Rgb Data converted to Jpeg data
 24 */
 25 bool JpegCompress(int w,int h,const char * rgb_data,int rgb_size,
 26                   char * jpeg_data,int *jpeg_size){
 27     struct jpeg_compress_struct cinfo;
 28     struct jpeg_error_mgr jerr;
 29     struct jpeg_destination_mgr jpegDstManager;
 30     int ret;
 31     unsigned char *srcBuf = new unsigned char[w * 3];
 32     JSAMPROW rowPointer[1];
 33     rowPointer[0= (JSAMPROW)srcBuf;
 34     int left_size;
 35     left_size = *jpeg_size;
 36     cinfo.err = jpeg_std_error(&jerr);
 37     jpeg_create_compress(&cinfo);
 38 
 39     cinfo.image_width = w;
 40     cinfo.image_height = h;
 41     cinfo.input_components = 3;
 42     cinfo.in_color_space = JCS_RGB;
 43     cinfo.raw_data_in = true;
 44     jpeg_set_defaults(&cinfo);
 45     
 46     
 47     cinfo.dest = &jpegDstManager;
 48     
 49     jpegDstManager.next_output_byte = (unsigned char*)jpeg_data;
 50     jpegDstManager.free_in_buffer = left_size;
 51     jpegDstManager.init_destination = JpegInitDestination;
 52     jpegDstManager.empty_output_buffer = JpegEmptyOutputBuffer;
 53     jpegDstManager.term_destination = JpegTermDestination;
 54         
 55     //jpeg_set_quality(&cinfo, 20, TRUE);
 56     
 57     jpeg_start_compress(&cinfo, TRUE);    
 58     for(int y=0;y< h;y++){
 59         rowPointer[0= (unsigned char*)(rgb_data + y*w*3);
 60         ret = jpeg_write_scanlines(&cinfo, rowPointer, 1);
 61     }
 62     jpeg_finish_compress(&cinfo);    
 63     jpeg_destroy_compress(&cinfo);    
 64     *jpeg_size = left_size - jpegDstManager.free_in_buffer;
 65     return true;
 66 }
 67 
 68 void
 69 JpegInitSource(j_decompress_ptr cinfo)
 70 {
 71 
 72 }
 73 
 74 boolean
 75 JpegFillInputBuffer(j_decompress_ptr cinfo)
 76 {
 77     /*
 78     jpegError = true;
 79     jpegSrcManager.bytes_in_buffer = jpegBufferLen;
 80     jpegSrcManager.next_input_byte = (JOCTET *)jpegBufferPtr;    */
 81     return TRUE;
 82 }
 83 
 84 void
 85 JpegSkipInputData(j_decompress_ptr cinfo, long num_bytes)
 86 {/*
 87     if (num_bytes < 0 || (size_t)num_bytes > jpegSrcManager.bytes_in_buffer) {
 88         jpegError = true;
 89         jpegSrcManager.bytes_in_buffer = jpegBufferLen;
 90         jpegSrcManager.next_input_byte = (JOCTET *)jpegBufferPtr;
 91     } else {
 92         jpegSrcManager.next_input_byte += (size_t) num_bytes;
 93         jpegSrcManager.bytes_in_buffer -= (size_t) num_bytes;
 94     }*/
 95 }
 96 
 97 void
 98 JpegTermSource(j_decompress_ptr cinfo)
 99 {
100     /* No work necessary here. */
101 }
102 
103 bool JpegUnCompress(const char * jpeg_data,int jpeg_size,
104                     char *rgb_data,int rgb_size,int w,int h){
105     struct jpeg_decompress_struct cinfo;
106     struct jpeg_error_mgr jerr;
107     struct jpeg_source_mgr jpegSrcManager;
108     int ret;
109     JSAMPROW rowPointer[1];
110     cinfo.err = jpeg_std_error(&jerr);
111     jpeg_create_decompress(&cinfo);
112 
113     jpegSrcManager.init_source = JpegInitSource;
114     jpegSrcManager.fill_input_buffer = JpegFillInputBuffer;
115     jpegSrcManager.skip_input_data = JpegSkipInputData;
116     jpegSrcManager.resync_to_restart = jpeg_resync_to_restart;
117     jpegSrcManager.term_source = JpegTermSource;
118     jpegSrcManager.next_input_byte = (unsigned char*)jpeg_data;
119     jpegSrcManager.bytes_in_buffer = jpeg_size;
120     cinfo.src = &jpegSrcManager;
121     
122     jpeg_read_header(&cinfo, TRUE);
123     cinfo.out_color_space = JCS_RGB;
124     jpeg_start_decompress(&cinfo);
125     if( cinfo.output_width != (unsigned int)w && cinfo.output_height != (unsigned int)h){
126         jpeg_destroy_decompress(&cinfo);
127         return false;
128     }
129     for (int dy = 0; cinfo.output_scanline < cinfo.output_height; dy++) {
130         rowPointer[0= (unsigned char *)(rgb_data + w*dy*3);
131         ret = jpeg_read_scanlines(&cinfo, rowPointer, 1);
132     }
133     jpeg_finish_decompress(&cinfo);        
134     jpeg_destroy_decompress(&cinfo);        
135     return true;
136 }
137 
posted @ 2006-03-02 00:47 放屁阿狗 阅读(8453) | 评论 (9)编辑 收藏

     摘要:  1  2 #ifndef _BITMAP_H 3 #define _BITMAP_H 4  5 #include <windows.h> 6  7 void SaveImage(const cha...  阅读全文
posted @ 2006-03-02 00:45 放屁阿狗 阅读(2374) | 评论 (0)编辑 收藏

     摘要:  1 // VideoDrawer.h: interface for the CVideoDrawer class. 2 // 3 //////////////////////////////////////////////////////////////////////&nbs...  阅读全文
posted @ 2006-03-02 00:42 放屁阿狗 阅读(1453) | 评论 (0)编辑 收藏

仅列出标题
共25页: First 17 18 19 20 21 22 23 24 25