当前位置: 首页 > news >正文

无锡网站排名哪家好/疫情防控最新政策

无锡网站排名哪家好,疫情防控最新政策,wordpress标题去掉私密,公司建设网站价格多少钱在Delphi中创建线程,请一定使用BeginThread()代替CreateThread()创建线程!如果直接使用Win32的API函数CreateThread()创建多个线程,也是可以创建的。但是,你应该明白,在每个线程中动态分配和销毁内存块,是需…
在Delphi中创建线程,请一定使用BeginThread()代替CreateThread()创建线程!如果直接使用Win32的API函数CreateThread()创建多个线程,也是可以创建的。但是,你应该明白,在每个线程中动态分配和销毁内存块,是需要同步保护的。Delphi语言中有一个在使用多线程环境下至关重要的全局变量IsMultiThread,系统在进行内存分配的时候,根据IsMultiThread变量值判断当前是否使用在多线程环境下,如果该变量为True,哪么,系统在分配和销毁内存的时候,是要进行同步保护的。相反,则不用同步保护。所以,如果你直接使用CreateThread()创建线程,一定要记得手动将IsMultiThread变量置为True。要不然你就会经常发现系统内存非法访问错误!如果你使用Delphi中的BeginThread()创建线程,这个BeginThread()的实现如下:
function BeginThread(SecurityAttributes: Pointer; StackSize: LongWord;ThreadFunc: TThreadFunc; Parameter: Pointer; CreationFlags: LongWord;var ThreadId: LongWord): Integer;
varP: PThreadRec;
beginNew(P);P.Func := ThreadFunc;P.Parameter := Parameter;IsMultiThread := TRUE;Result := CreateThread(SecurityAttributes, StackSize, @ThreadWrapper, P,CreationFlags, ThreadID);
end;看见了吗?上面已经将IsMultiThread := TRUE;这样就保证了在多线程下,内存使用的安全。使用BeginThread()函数替代CreateThread()的另一个重要理由就在上面的的代码段中,你发现了吗?BeginThread()函数内部在调用CreateThread()的时候,哪个线程函数指针用的是@ThreadWrapper,参数用的是P,而 P: PThreadRec;  是一个结构体指针,结构体内部分别才是线程函数和线程函数参数。ThreadWrapper函数实现如下:
{$IFDEF MSWINDOWS}
function ThreadWrapper(Parameter: Pointer): Integer; stdcall;
{$ELSE}
function ThreadWrapper(Parameter: Pointer): Pointer; cdecl;
{$ENDIF}
asm
{$IFDEF PC_MAPPED_EXCEPTIONS}{ Mark the top of the stack with a signature }PUSH    UNWINDFI_TOPOFSTACK
{$ENDIF}CALL    _FpuInitPUSH    EBP
{$IFNDEF PC_MAPPED_EXCEPTIONS}XOR     ECX,ECXPUSH    offset _ExceptionHandlerMOV     EDX,FS:[ECX]PUSH    EDXMOV     FS:[ECX],ESP
{$ENDIF}
{$IFDEF PC_MAPPED_EXCEPTIONS}// The signal handling code in SysUtils depends on being able to// discriminate between Delphi threads and foreign threads in order// to choose the disposition of certain signals.  It does this by// testing a TLS index.  However, we allocate TLS in a lazy fashion,// so this test can fail unless we've already allocated the TLS segment.// So we force the allocation of the TLS index value by touching a TLS// value here.  So don't remove this silly call to AreOSExceptionsBlocked.
        CALL    AreOSExceptionsBlocked
{$ENDIF}MOV     EAX,ParameterMOV     ECX,[EAX].TThreadRec.ParameterMOV     EDX,[EAX].TThreadRec.FuncPUSH    ECXPUSH    EDXCALL    _FreeMemPOP     EDXPOP     EAXCALL    EDX{$IFNDEF PC_MAPPED_EXCEPTIONS}XOR     EDX,EDXPOP     ECXMOV     FS:[EDX],ECXPOP     ECX
{$ENDIF}POP     EBP
{$IFDEF PC_MAPPED_EXCEPTIONS}{ Ditch our TOS marker }ADD     ESP, 4
{$ENDIF}
end;ThreadWrapper函数是使用BASM汇编代码实现,如果你熟悉BASM汇编,你就知道,前面的代码,是BASM汇编中函数传参数的约定,后面的才是重点,它内部实现了当执行线程函数出现异常错误时,转化为异常的机制。如果你直接使用CreateThread()创建线程,当然就不会有执行线程函数提供触发异常这样的好处,这才是使用BeginThread()函数替代CreateThread()的最重要原因,也是根本原因。线程中的异常机制很重要吗?当然重要!因为线程函数只是一个执行函数过程体,当在这个函数的执行过程中,如果发生异常,程序就会退出当前线程函数,也就是线程会终止。所以在线程中提供异常机制,并让我们在线程中可以捕获处理,是非常至关重要的。

转自http://blog.csdn.net/zang141588761/article/details/51654748

 

转载于:https://www.cnblogs.com/zyb2016/p/11151686.html

http://www.lbrq.cn/news/1431091.html

相关文章:

  • 对新网站做seo大概需要多久/今日国际军事新闻
  • 贵阳高端网站设计公司/app推广平台排行榜
  • 关于化妆品网站成功案例/成功的网络营销案例及分析
  • 网站备案符号/如何被百度收录
  • 做的比较好的网站/百度快速排名 搜
  • 网站开发 周期/网站首页面设计
  • 庆阳网站网站建设/b站视频推广
  • .我爱你 域名网站/百度平台营销软件
  • 曲阜住房和城乡建设局网站/友情链接搜读
  • 男女在床上做孔网站/厦门seo俱乐部
  • 威海做网站公司/软文编辑器
  • 自做网站视频/长沙网站优化指导
  • 做网站499/文库百度登录入口
  • 南京做网站建设有哪些内容/企业网站seo平台
  • 企业网站城市分站系统/深圳知名网络优化公司
  • 应用商城app开发/杭州seo推广公司
  • 购物平台排行榜2021/seo推广培训班
  • 百度百科分类方法/专业seo整站优化
  • .com域名做外贸网站/网站优化内容
  • 今天宁波最新消息/资源优化网站排名
  • 乌鲁木齐正规网站建设电话/国内十大搜索引擎网站
  • 网站做广告如何做帐/b站2023年免费入口
  • 做花酒的网站/网络seo关键词优化技术
  • 杭州网站制作方法/怎么把产品推广到各大平台
  • 普陀做网站/微信小程序开发流程
  • 做电商赚钱吗/南京seo排名扣费
  • 新手学做免费网站软件好/菏泽资深seo报价
  • 深圳网站建设的公司/百度问一问在线咨询客服
  • 学校网站建设情况说明书/一媒体app软件下载老版本
  • 深圳建站模板建站/seo技术外包公司
  • Exif.js获取手机拍摄照片的经纬度
  • 可视化调试LangChain SQLChatMessageHistory:SQLite数据库查看全攻略
  • 【物联网】基于树莓派的物联网开发【26】——树莓派开启串口并配置串口助手Minicom
  • Openlayers基础教程|从前端框架到GIS开发系列课程(24)openlayers结合canva绘制矩形绘制线
  • Flutter学习笔记(六)---状态管理、事件、路由、动画
  • 【PRML】分类