有两个线程, 一个负责发送数据, 另外一个线程往第一个线程中写入数据, 然后通知它发送数据。
而第一个线程,就是等着通知, 在被通知唤醒之后就检查有没有数据需要发送, 有则发送, 然后继续睡眠。
这样一个结构很是简单, 但是我总是搞不定, 忘高手写个模型,谢谢。这是一个热门帖子,用java实现的, 不懂java用win32实现,怎么做啊??
//ps:有人说用信号来做,信号到底是什么???? 信号量???? 不是吧

解决方案 »

  1.   

    ls, 我把链接给你,你看吧,搜出什么玩意来了http://social.msdn.microsoft.com/search/en-us?query=single&x=11&y=12
      

  2.   


    #include "CWin32Signal.h"
    //Begin section for file CWin32Signal.cpp
    //TODO: Add definitions that you want preserved
    //End section for file CWin32Signal.cpp
    //@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
    atom::CWin32Signal::CWin32Signal() : handle(NULL)
    {
        //TODO Auto-generated method stub
        #ifdef _WIN32
        handle = CreateEvent( NULL, TRUE, TRUE, NULL );
        #endif
    }//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
    atom::CWin32Signal::CWin32Signal(const char * name) : handle(NULL)
    {
        //TODO Auto-generated method stub
        #ifdef _WIN32
        handle = CreateEvent( NULL, TRUE, TRUE, name );
        #else
        UNREFERENCED_PARAMETER( name );
        #endif
    }//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
    atom::CWin32Signal::~CWin32Signal() 
    {
        //TODO Auto-generated method stub
        #ifdef _WIN32
        if( handle ) CloseHandle( handle );
        #endif
    }//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
    bool atom::CWin32Signal::Reset() 
    {
        //TODO Auto-generated method stub
        bool result = false;
        #ifdef _WIN32
        if( handle ) {
            result = ( ResetEvent(handle) == TRUE );
        }
        #endif
        return result;
    }//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
    bool atom::CWin32Signal::Awake() 
    {
        //TODO Auto-generated method stub
        bool result = false;
        #ifdef _WIN32
        if( handle ) {
            result = ( SetEvent(handle) == TRUE );
        }
        #endif
        return result;
    }//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
    bool atom::CWin32Signal::Await(U64 timeout) 
    {
        //TODO Auto-generated method stub
        bool result = false;
        
        #ifdef _WIN32
        if( handle ) {
            WaitForSingleObject( handle, static_cast<DWORD>(timeout) );
            result = true;
        }    #else    UNREFERENCED_PARAMETER( timeout );
        #endif    return result;
    }//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
    cupid::CInvokeThread::CInvokeThread() : 
    CThread("Invoke Dispatcher"),signal("Invoke Service")
    {
        //TODO Auto-generated method stub
        signal.Reset();
    }//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
    cupid::CInvokeThread::~CInvokeThread() 
    {
        //TODO Auto-generated method stub
    }//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
    bool cupid::CInvokeThread::Awaken() 
    {
        //TODO Auto-generated method stub
        return signal.Awaken();
    }//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
    void cupid::CInvokeThread::SetActive(bool value) 
    {
        //TODO Auto-generated method stub
        active = value;
    }//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
    bool cupid::CInvokeThread::GetActive() 
    {
        //TODO Auto-generated method stub
        return active;
    }//@generated "UML to C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
    unsigned int cupid::CInvokeThread::Run() 
    {
        //TODO Auto-generated method stub    CMilisecondTimer timer;
        unsigned long elapse = 0;    for(;;)
        {
            timer.Record();        // working......        // 如果不再有效,则终止循环
            if( GetActive() == false ) break;        elapse = timer.GetElapsedTime();        // 休眠
            if( elapse < 5 )
            {
                signal.Reset();
                signal.Wait( 5 - elapse );
            }
        }
        return 0;
    }外部线程调用Awake即可。