twainuer里面把图像的接收改到另一个线程中

This commit is contained in:
luoliangyi 2023-05-12 09:38:37 +08:00
parent 00ae7dbda2
commit 7791cd3b77
2 changed files with 55 additions and 20 deletions

View File

@ -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();
}
}

View File

@ -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__ */