twainuer里面把图像的接收改到另一个线程中
This commit is contained in:
parent
00ae7dbda2
commit
7791cd3b77
|
@ -307,26 +307,7 @@ LRESULT CALLBACK HGTwainDSMImpl::NewWndProc(HWND hWnd, UINT msg, WPARAM wParam,
|
|||
{
|
||||
if (MSG_XFERREADY == twEvent.TWMessage)
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
HGImage image = NULL;
|
||||
p->m_listDSImpl[i]->ImageNativeXfer(0, 0, &image);
|
||||
if (NULL != image)
|
||||
{
|
||||
if (NULL != p->m_listDSImpl[i]->m_imageFunc)
|
||||
p->m_listDSImpl[i]->m_imageFunc((HGTwainDS)p->m_listDSImpl[i], image, p->m_listDSImpl[i]->m_imageParam);
|
||||
HGBase_DestroyImage(image);
|
||||
}
|
||||
|
||||
HGUInt count = 0;
|
||||
p->m_listDSImpl[i]->EndXfer(&count);
|
||||
if (0 == count)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
p->m_listDSImpl[i]->Reset();
|
||||
HGBase_SetEvent(p->m_listDSImpl[i]->m_event);
|
||||
}
|
||||
else if (MSG_CLOSEDSREQ == twEvent.TWMessage)
|
||||
{
|
||||
|
@ -351,6 +332,9 @@ HGTwainDSImpl::HGTwainDSImpl(HGTwainDSMImpl* dsmImpl)
|
|||
m_eventParam = NULL;
|
||||
m_imageFunc = NULL;
|
||||
m_imageParam = NULL;
|
||||
m_event = NULL;
|
||||
m_stopThread = HGFALSE;
|
||||
m_thread = NULL;
|
||||
}
|
||||
|
||||
HGTwainDSImpl::~HGTwainDSImpl()
|
||||
|
@ -370,6 +354,11 @@ HGResult HGTwainDSImpl::Open(TW_IDENTITY* iden)
|
|||
}
|
||||
|
||||
memcpy(&m_iden, iden, sizeof(TW_IDENTITY));
|
||||
|
||||
HGBase_CreateEvent(HGFALSE, HGFALSE, &m_event);
|
||||
m_stopThread = HGFALSE;
|
||||
HGBase_OpenThread(ThreadFunc, this, &m_thread);
|
||||
|
||||
m_open = HGTRUE;
|
||||
return HGBASE_ERR_OK;
|
||||
}
|
||||
|
@ -380,6 +369,14 @@ HGResult HGTwainDSImpl::Close()
|
|||
|
||||
Disable();
|
||||
m_dsmImpl->m_pDSMProc(&m_dsmImpl->m_AppId, NULL, DG_CONTROL, DAT_IDENTITY, MSG_CLOSEDS, (TW_MEMREF)&m_iden);
|
||||
|
||||
m_stopThread = HGTRUE;
|
||||
HGBase_SetEvent(m_event);
|
||||
HGBase_CloseThread(m_thread);
|
||||
m_thread = NULL;
|
||||
HGBase_DestroyEvent(m_event);
|
||||
m_event = NULL;
|
||||
|
||||
m_open = HGFALSE;
|
||||
m_dsmImpl->RemoveDS(this);
|
||||
return HGBASE_ERR_OK;
|
||||
|
@ -629,3 +626,34 @@ HGResult HGTwainDSImpl::Reset()
|
|||
|
||||
return HGBASE_ERR_OK;
|
||||
}
|
||||
|
||||
void HGAPI HGTwainDSImpl::ThreadFunc(HGThread thread, HGPointer param)
|
||||
{
|
||||
(void)thread;
|
||||
HGTwainDSImpl *p = (HGTwainDSImpl *)param;
|
||||
while (!p->m_stopThread)
|
||||
{
|
||||
HGBase_WaitEvent(p->m_event);
|
||||
|
||||
while (1)
|
||||
{
|
||||
HGImage image = NULL;
|
||||
p->ImageNativeXfer(0, 0, &image);
|
||||
if (NULL != image)
|
||||
{
|
||||
if (NULL != p->m_imageFunc)
|
||||
p->m_imageFunc((HGTwainDS)p, image, p->m_imageParam);
|
||||
HGBase_DestroyImage(image);
|
||||
}
|
||||
|
||||
HGUInt count = 0;
|
||||
p->EndXfer(&count);
|
||||
if (0 == count)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
p->Reset();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
|
||||
#include "HGTwain.h"
|
||||
#include "../base/HGDll.h"
|
||||
#include "../base/HGEvent.h"
|
||||
#include "../base/HGThread.h"
|
||||
#include "twain/twain.h"
|
||||
#include "saneui/HGSaneUI.h"
|
||||
#include <vector>
|
||||
|
@ -64,6 +66,8 @@ private:
|
|||
HGResult EndXfer(HGUInt* count);
|
||||
HGResult Reset();
|
||||
|
||||
static void HGAPI ThreadFunc(HGThread thread, HGPointer param);
|
||||
|
||||
private:
|
||||
HGTwainDSMImpl* m_dsmImpl;
|
||||
TW_IDENTITY m_iden;
|
||||
|
@ -74,6 +78,9 @@ private:
|
|||
HGPointer m_eventParam;
|
||||
HGDSImageFunc m_imageFunc;
|
||||
HGPointer m_imageParam;
|
||||
HGEvent m_event;
|
||||
volatile HGBool m_stopThread;
|
||||
HGThread m_thread;
|
||||
};
|
||||
|
||||
#endif /* __HGTWAINIMPL_HPP__ */
|
||||
|
|
Loading…
Reference in New Issue