delphi – 是否可以启动(并停止)DLL中的线程?

delphi – 是否可以启动(并停止)DLL中的线程?,第1张

概述我正在考虑为我做的一些常见事情构建DLL的一些想法.有一件事我想检查是否有可能在DLL中运行一个线程.我确信我至少可以启动它,并在终止时自动释放它(并强制终止它自己) – 我可以看到这不会是一个大问题.但是一旦我开始它,我不知道如何继续与它通信(特别是为了阻止它)主要是因为每次调用DLL都是唯一的(据我的知识告诉我)但我也知道很少学科. 我已经看到在某些情况下,DLL可以在开始时加载,并在不再需要 我正在考虑为我做的一些常见事情构建DLL的一些想法.有一件事我想检查是否有可能在DLL中运行一个线程.我确信我至少可以启动它,并在终止时自动释放它(并强制终止它自己) – 我可以看到这不会是一个大问题.但是一旦我开始它,我不知道如何继续与它通信(特别是为了阻止它)主要是因为每次调用DLL都是唯一的(据我的知识告诉我)但我也知道很少学科.

我已经看到在某些情况下,DLL可以在开始时加载,并在不再需要时在最后发布.我对这种方法有0个知识或经验,除了看到与之相关的东西,甚至不能告诉你什么或如何,我不记得了.但这有可能吗?

我知道ActiveX / COM,但这不是我想要的 – 我只想要一个可以跨语言使用的基本DLL(特别是C#).

另外,如果可能,那么我将如何从DLL到应用程序进行回调?例如,当我启动线程时,我很可能会将一个函数(在EXE中)分配为事件的处理程序(由DLL触发).

所以我想我要问的是 – 如何加载DLL以进行连续工作并在完成后释放它 – 而不是根据需要调用DLL中的单个函数的简单方法.在相同的情况下 – 我可能会在DLL中分配变量或创建对象.我怎样才能确保一旦我分配了该变量(或创建对象),我怎样才能确保下次调用DLL时变量或对象仍然可用?显然,它需要一种初始化/最终化DLL的机制(I.E.在加载DLL时在DLL内创建对象,并在卸载DLL时释放对象).

编辑:最后,我将DLL包装在组件内部,所以当创建组件的实例时,将加载DLL并在DLL内部创建相应的线程,然后当组件被释放时,DLL已卸载.还需要确保如果存在这些组件中的2个,则将为每个组件加载2个DLL实例.

这与IInterface的使用有何关联?因为我也有0经验.

无需使用示例源代码直接回答 – 指向优秀教程的链接非常棒.

解决方法 您正在寻找的基本模式如下:

> EXE调用DLL中的函数.
> EXE根据需要传递参数.
> DLL执行工作,启动线程,返回句柄.并且通过句柄我的意思是松散的工作意义而不是意味着Windows句柄.
> EXE现在可以通过调用更多函数,传递句柄来进一步与DLL通信.
> DLL可以与EXE通信,例如通过回调,只要EXE提供了回调.
>当需要停止时,EXE调用DLL函数,传递句柄.此时DLL整理了一下.

句柄后面是DLL需要跟踪调用之间的任何状态.从EXE的角度来看,这个手柄是不透明的.

即使使用像C这样的非OOP语言,这种模式也可以正常工作.但是,使用OOP工具要容易得多.由于您希望跨越模块边界,因此使用接口而不是Delphi对象会更安全.如果跨模块边界传递Delphi对象,则只能传递对象的数据部分,而不能传递代码部分.

使用接口时,DLL返回的接口变量将作为上面编号列表中的句柄.它包含任何实例数据.接口的使用允许随时可扩展.

至于线程部分,最好使用更高级别的线程库而不是原始线程.我推荐的图书馆是PrimožGabrijelčič的OmniThreadLibrary.

关于你的编辑:

I will wrap the DLL insIDe of a component,so when an instance of the component is created,DLL will be loaded and a corresponding thread will be created insIDe the DLL,then when the component is free’d,the DLL is unloaded. Also need to make sure that if there are for example 2 of these components,that there will be 2 instances of the DLL loaded for each component.

将DLL加载到进程中时,只有一个实例.特别是如果您打算使用全局变量,那么每个全局变量只有一个实例,而不管您调用Loadlibrary的次数.

总结

以上是内存溢出为你收集整理的delphi – 是否可以启动(并停止)DLL中的线程?全部内容,希望文章能够帮你解决delphi – 是否可以启动(并停止)DLL中的线程?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1268174.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-08
下一篇2022-06-08

发表评论

登录后才能评论

评论列表(0条)

    保存