# include“l_bitmap.h”
L_LTFIL_API L_INTEXT_CALLBACKL_SetFilterHeartbeatCallback (pCallback pUserData)
设置用于跟踪和中止长时间运行的操作的回调。
当过滤器心跳发生时触发的回调函数。
可用于传递回调函数所需的一个或多个附加参数的Void指针。
若要使用此功能,请为变量赋值或创建包含所需多个字段的结构。然后,在此参数中传递变量或结构的地址,将其强制转换为L_VOID*。回调函数,它以自己的方式接收地址pUserData
参数时,可以将其强制转换为适当数据类型的指针,以访问变量或结构。
如果不需要额外的参数,则可以在此参数中传递NULL。
价值 | 意义 |
---|---|
成功 | 函数运行成功。 |
< 1 | 发生错误。指返回代码. |
LEADTOOLS加载文件函数包含FILEREADCALLBACK.它用于通过调用来监视加载图像的进度L_LoadFile或L_LoadSvg2.FILEREADCALLBACK
非常适合栅格图像:过滤器(例如PNG或TIF)可以快速解析图像文件结构,并开始快速向回调发送一条或多条扫描线。因此,FILEREADCALLBACK
事件将在不久后开始发生负载
/LoadSvg
被称为。应用程序可以使用FILEREADCALLBACK
显示进度条,允许用户监视并可能中止加载操作。
FILEREADCALLBACK
不能很好地处理复杂的文档文件格式,如DOCX和XSLX。它们复杂的结构需要更多的时间来解析文件结构。生成并发送到的第一条扫描线FILEREADCALLBACK
可能要很久以后才会发生负载
/LoadSvg
被称为。加载所需的时间取决于源文件本身。对于非常复杂的文档文件,例如具有数千或数百万行的非常大的XLSX电子表格,时间可能是几秒甚至几分钟。此外,文件结构解析通常通过调用L_FileInfo(无论是由用户直接调用,还是由负载
/LoadSvg
),其中没有一个调用FILEREADCALLBACK
在所有。
对于复杂的文档,使用FILEREADCALLBACK
允许用户中止长时间的加载操作是不可行的:回调将在所有必要的数据被解析后的操作最后发生。从原作开始,可能已经过去了很长一段时间负载
/LoadSvg
被称为。相反,应用程序可以使用L_SetFilterHeartbeatCallback监视和中止长时间的操作。FILTERHEARTBEATCALLBACK发生在开头L_FileInfo
,然后在这个函数中周期性地重复一次负载
/LoadSvg
,如果需要,允许用户中止当前操作。
的FILTERHEARTBEATCALLBACK将会触发,并且应用程序可以将返回值设置为ERROR_USER_ABORT终止当前操作,如下所示:
L_FileInfo
将返回ERROR_USER_ABORT
而不是成功
.L_LoadFile
/L_LoadSvg2
将返回ERROR_USER_ABORT
而不是成功
.换句话说,中止筛选器操作不会抛出异常。相反,应用程序应该像上面描述的那样检查返回的对象,以检测用户何时中止。
一些应用程序要求所有超过一定时间的加载操作被中止(例如,web服务器使用LEADTOOLS在web方法中加载和返回图像)。此服务器可能要求在web方法中运行的任何操作都不能超过2秒。当发生这种情况时,应该中止操作,并将工作委托给web服务工作者线程之外的专用线程或进程。
L_SetFilterHeartbeatCallback
可用于安装一个回调,该回调跟踪时间并终止所有花费超过分配时间的操作。或者,L_SetFilterTimeout
可用于为所有获取信息和加载操作设置全局超时间隔。这个函数使用L_SetFilterHeartbeatCallback
在内部安装一个处理程序,该处理程序可以自动中止长时间运行的操作。
目前,过滤心跳和超时只支持以下文件格式:
Win32, x64, Linux。
使用一个非常大且复杂的XLSX文档和一个以秒为单位的超时值调用此方法
成功时返回true,失败时返回false
对于每个页面,图像被加载并传递给processImage操作
//使用一个非常大且复杂的XLSX文档和一个以秒为单位的超时值调用此方法
//成功时返回true,失败时返回false
//对于每个页面,图像被加载并传递给processImage操作
类秒表
{
公共:秒表()
{
#如果定义(FOR_UNIX) !
LARGE_INTEGER李;
QueryPerformanceFrequency (,);
_Frequency = (L_DOUBLE)QuadPart / 1000.0;
#其他的
_Frequency = 1;
# endif
重置();
}
公共: L_VOID Reset()
{
#如果定义(FOR_UNIX) !
LARGE_INTEGER李;
QueryPerformanceCounter (,);
_StartTime = (L_DOUBLE)li.QuadPart;
#其他的
结构体timespec李;
clock_gettime (CLOCK_REALTIME,);
_StartTime = ((L_DOUBLE))tv_sec * 1000.0) + ((L_DOUBLE)Tv_nsec / 1.06);
# endif
}
公共: L_UINT ElapsedMilliseconds()
{
L_DOUBLE nowTime;
#如果定义(FOR_UNIX) !
LARGE_INTEGER李;
QueryPerformanceCounter (,);
nowTime = (L_DOUBLE)li.QuadPart;
#其他的
结构体timespec李;
clock_gettime (CLOCK_REALTIME,);
现在的时间= ((L_DOUBLE)li。tv_sec * 1000.0) + ((L_DOUBLE)Tv_nsec / 1.06);
# endif
L_DOUBLE interval = (nowTime - _StartTime) / _Frequency;
返回(L_UINT)间隔;
}
私人: L_DOUBLE _Frequency;
私人: L_DOUBLE _StartTime;
};
类CallbackData
{
公共:秒表秒表;
公共: L_UINT TimeoutMilliseconds;
};
静态L_INT EXT_CALLBACK FilterHeartbeatCallback(L_VOID* /*data*/, L_VOID* userData)
{
//如果距离上次操作超过timeout秒,则终止操作
CallbackData* CallbackData =reinterpret_cast< CallbackData * >(用户数据);
如果(callbackData->Stopwatch.ElapsedMilliseconds() > callbackData->TimeoutMilliseconds)
{
返回ERROR_USER_ABORT;
}
其他的
{
返回成功;
}
}
类型定义L_INT(*PROCESS_IMAGE)(BITMAPHANDLE* BITMAPHANDLE, L_INT pageNumber);
l_char * inputFileName, L_UINT timeoutSeconds, PROCESS_IMAGE processImage)
{
CallbackData CallbackData;
callbackData。TimeoutMilliseconds = timeoutSeconds * 1000;
//这是开始时间,我们将重置这个值
//任何时候开始操作
callbackData.Stopwatch.Reset ();
//设置回调
L_INT ret = L_SetFilterHeartbeatCallback(FilterHeartbeatCallback, &callbackData);
//重新设置开始时间
callbackData.Stopwatch.Reset ();
//首先,获取文件的信息以获取页面数
intpageCount = 0;
FILEINFO FILEINFO;
memset (&fileInfo 0运算符(FILEINFO));
ret = L_FileInfo(inputFileName, &fileInfo,运算符(fileinfo), fileinfo_totalpages, null);
//如果L_FileInfo超过timeoutSeconds,则返回ERROR_USER_ABORT
如果(ret == ERROR_USER_ABORT)
{
printf (“中止\ n”);
}
/ /失败
如果(ret != SUCCESS)
{
L_SetFilterHeartbeatCallback(空,空);
返回受潮湿腐烂;
}
//现在加载所有页面
LOADFILEOPTION LOADFILEOPTION;
memset (&loadFileOption 0运算符(LOADFILEOPTION));
L_GetDefaultLoadFileOption (&loadFileOption运算符(LOADFILEOPTION));
为(L_INT pageNumber = 1;pageNumber <= pageCount;pageNumber + +)
{
loadFileOption。PageNumber = PageNumber;
//重新设置开始时间
callbackData.Stopwatch.Reset ();
BITMAPHANDLE BITMAPHANDLE;
memset (&bitmapHandle 0运算符(BITMAPHANDLE));
ret = L_LoadBitmap(inputFileName, &bitmapHandle,运算符(BITMAPHANDLE), 0, ORDER_BGRORGRAY, &loadFileOption, NULL);
//如果L_LoadBitmap耗时超过timeoutSeconds,则返回ERROR_USER_ABORT
如果(ret == ERROR_USER_ABORT)
{
printf (“中止\ n”);
}
/ /失败
如果(ret != SUCCESS)
{
L_SetFilterHeartbeatCallback(空,空);
返回受潮湿腐烂;
}
//是否中止?
//处理后再删除
processImage (&bitmapHandle pageNumber);
L_FreeBitmap (&bitmapHandle);
}
L_SetFilterHeartbeatCallback(空,空);
//我们成功加载并处理了文件中的所有页面
返回真正的;
}
帮助收藏
光栅net|C API|c++类库|HTML5 JavaScript
文档net|C API|c++类库|HTML5 JavaScript
医疗net|C API|c++类库|HTML5 JavaScript
医疗网页查看器net
188宝金博怎么下载
支持的平台上
.NET、Java、Android和iOS/macOS程序集
C API/ c++类库
HTML5 JavaScript库
您的邮件已经发送到支持!应该有人保持联系!如果你有急事,请回来再谈。
聊天时间:
周一至周五,上午8:30至下午6点
感谢您的反馈!
请重新填写表格以开始新的聊天。
所有代理当前都处于离线状态。
聊天时间:
星期一至星期五
上午8:30 -下午6点
要联系我们,请填写此表格,我们将通过电子邮件与您联系。