// TIRQThread.cpp : implementation file // #include "stdafx.h" #include "COS.h" #include "COSDlg.h" #include "TIRQThread.h" #include "AIOWDM.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // TIRQThread IMPLEMENT_DYNCREATE(TIRQThread, CWinThread) TIRQThread::TIRQThread(void) { } TIRQThread::~TIRQThread(void) { } BOOL TIRQThread::InitInstance(void) { // MainWnd = m_pMainWnd; return TRUE; } BEGIN_MESSAGE_MAP(TIRQThread, CWinThread) //{{AFX_MSG_MAP(TIRQThread) // NOTE - the ClassWizard will add and remove mapping macros here. //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // TIRQThread message handlers int TIRQThread::Run(void) { if (MainWnd == NULL) return -1; while (WaitForIRQType() != 0) ReportIRQ(); LastError = GetLastError(); ReportError(); return CWinThread::Run(); } void TIRQThread::ReportError(void) { CSingleLock sLock(&((CCOSDlg*)MainWnd)->m_mutex); sLock.Lock(); if (LastError == ERROR_OPERATION_ABORTED) { // Prevent thread from writing to UI thread after UI is gone if(!((CCOSDlg*)MainWnd)->bShutdown) { ((CCOSDlg*)MainWnd)->AddLine(CardNum, "IRQ request aborted."); } } else if (LastError == ERROR_INVALID_FUNCTION) ((CCOSDlg*)MainWnd)->AddLine(CardNum, "Error: this card already has a pending IRQ request. IRQ request aborted."); else ((CCOSDlg*)MainWnd)->AddLine(CardNum, "Some error occurred in the driver. IRQ request aborted."); sLock.Unlock(); } void TIRQThread::ReportIRQ(void) { CSingleLock sLock(&((CCOSDlg*)MainWnd)->m_mutex); sLock.Lock(); if (COSPPIs == 0) ((CCOSDlg*)MainWnd)->ReceiveGenIRQ(CardNum); else ((CCOSDlg*)MainWnd)->ReceiveCOSData(CardNum, &COSData[0]); sLock.Unlock(); } unsigned long TIRQThread::WaitForIRQType(void) { if (COSPPIs != 0) return (COSWaitForIRQ(CardNum, COSPPIs, &COSData[0])); else return (WaitForIRQ(CardNum)); }