L_SetFilterHeartbeatCallback

# include“l_bitmap.h”

L_LTFIL_API L_INTEXT_CALLBACKL_SetFilterHeartbeatCallback (pCallback pUserData)

设置用于跟踪和中止长时间运行的操作的回调。

参数

FILTERHEARTBEATCALLBACKpCallback

当过滤器心跳发生时触发的回调函数。

L_VOID* pUserData

可用于传递回调函数所需的一个或多个附加参数的Void指针。

若要使用此功能,请为变量赋值或创建包含所需多个字段的结构。然后,在此参数中传递变量或结构的地址,将其强制转换为L_VOID*。回调函数,它以自己的方式接收地址pUserData参数时,可以将其强制转换为适当数据类型的指针,以访问变量或结构。

如果不需要额外的参数,则可以在此参数中传递NULL。

返回

价值 意义
成功 函数运行成功。
< 1 发生错误。指返回代码

评论

LEADTOOLS加载文件函数包含FILEREADCALLBACK.它用于通过调用来监视加载图像的进度L_LoadFileL_LoadSvg2FILEREADCALLBACK非常适合栅格图像:过滤器(例如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终止当前操作,如下所示:

换句话说,中止筛选器操作不会抛出异常。相反,应用程序应该像上面描述的那样检查返回的对象,以检测用户何时中止。

一些应用程序要求所有超过一定时间的加载操作被中止(例如,web服务器使用LEADTOOLS在web方法中加载和返回图像)。此服务器可能要求在web方法中运行的任何操作都不能超过2秒。当发生这种情况时,应该中止操作,并将工作委托给web服务工作者线程之外的专用线程或进程。

L_SetFilterHeartbeatCallback可用于安装一个回调,该回调跟踪时间并终止所有花费超过分配时间的操作。或者,L_SetFilterTimeout可用于为所有获取信息和加载操作设置全局超时间隔。这个函数使用L_SetFilterHeartbeatCallback在内部安装一个处理程序,该处理程序可以自动中止长时间运行的操作。

目前,过滤心跳和超时只支持以下文件格式:

所需的dll和库

平台

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);# endifL_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(空,空);//我们成功加载并处理了文件中的所有页面返回真正的}

LEADTOOLS光栅成像C API帮助
188金宝搏的网址客服|支持|联系我们|知识产权公告
©1991 - 2021领先科技有限公司版权所有。