⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 writethread.cpp

📁 GSM modem通讯控件
💻 CPP
字号:
// WriteThread.cpp : implementation file
//

#include "stdafx.h"
#include "commCtrl.h"
#include "WriteThread.h"
#include "mycomm.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CWriteThread

IMPLEMENT_DYNCREATE(CWriteThread, CWinThread)

CWriteThread::CWriteThread()
{
}

CWriteThread::~CWriteThread()
{
}

BOOL CWriteThread::InitInstance()
{
	 MSG msg;
    DWORD dwHandleSignaled;

    // Needed for overlapped I/O.
    OVERLAPPED overlappedWrite = {0, 0, 0, 0, NULL};

    overlappedWrite.hEvent = CreateEvent(NULL, TRUE, TRUE, NULL);
   while (TRUE)
    {
        if (!PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            dwHandleSignaled = 
                MsgWaitForMultipleObjects(0,NULL, FALSE,
                    INFINITE, QS_ALLINPUT);

            if (dwHandleSignaled==WAIT_OBJECT_0)    continue;
        }

        if (msg.hwnd != NULL)
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);

            continue;
        }
        switch(msg.message)
        {
            case PWM_COMMWRITE:  // New string to write to Comm port.
            {
 
                if (!WriteData(&overlappedWrite,
                        (BYTE*) msg.lParam, (DWORD) msg.wParam))
                {
             //       LocalFree((HLOCAL) msg.lParam); 
                    goto EndWriteThread;
                }
				 // Data was sent in a LocalAlloc()d buffer.  Must free it.
           //     LocalFree((HLOCAL) msg.lParam); 
				
                break;
            }
            case PWM_QUIT:
			{
				goto EndWriteThread;
		    		
			}
            default:
            {
              break;
            }
        } // End of switch(message)

    } // End of main loop.

    // Thats the end.  Now clean up.
  EndWriteThread:

    PurgeComm(pComm->hCommFile , PURGE_TXABORT | PURGE_TXCLEAR);

    CloseHandle(overlappedWrite.hEvent);
 	return false;
} 

int CWriteThread::ExitInstance()
{
	// TODO:  perform any per-thread cleanup here
    PurgeComm(pComm->hCommFile, PURGE_TXABORT | PURGE_TXCLEAR);
	return CWinThread::ExitInstance();
}

BEGIN_MESSAGE_MAP(CWriteThread, CWinThread)
	//{{AFX_MSG_MAP(CWriteThread)
  //  ON_MESSAGE(PWM_COMMWRITE,OnWrite)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CWriteThread message handlers

BOOL CWriteThread::WriteData(LPOVERLAPPED lpOverlappedWrite, BYTE *lpszStringToWrite, DWORD dwNumberOfBytesToWrite)
{
    DWORD dwLastError;

    DWORD dwNumberOfBytesWritten = 0;
    DWORD dwWhereToStartWriting = 0; 
 
    do
    {
        if (!WriteFile(pComm->hCommFile,&lpszStringToWrite[ dwWhereToStartWriting ], 
                dwNumberOfBytesToWrite, &dwNumberOfBytesWritten,lpOverlappedWrite))
		{
			 dwLastError = GetLastError();
			if (dwLastError != ERROR_IO_PENDING)
			 {
                return FALSE;
			 }
            if (WAIT_OBJECT_0 == WaitForSingleObject(lpOverlappedWrite -> hEvent,INFINITE))
			 {
				pComm->OnEvent("TX_COMPLETE");
			 }
            if (!GetOverlappedResult(pComm->hCommFile,lpOverlappedWrite,&dwNumberOfBytesWritten, TRUE))
            {
                return FALSE;
            }
        }
        dwNumberOfBytesToWrite -= dwNumberOfBytesWritten;
        dwWhereToStartWriting += dwNumberOfBytesWritten;
    }while(dwNumberOfBytesToWrite > 0);  

    return TRUE;
}



void CWriteThread::OnWrite(WPARAM wparam,LPARAM lparam)
{

    OVERLAPPED overlappedWrite = {0, 0, 0, 0, NULL};
    overlappedWrite.hEvent = CreateEvent(NULL, TRUE, TRUE, NULL);
    WriteData(&overlappedWrite,(BYTE*) lparam, (DWORD) wparam);
    LocalFree((HLOCAL) lparam);
	CloseHandle(overlappedWrite.hEvent);
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -