我必须在主线程的上下文中执行一些代码。我正在使用Lazarus + FPC。我从DLL中的一个线程(如果在Linux上的共享库)中收到一个事件,并调用我的回调函数。请注意,此函数不是任何类的成员,而是附加了“cdecl”指令的独立传统函数。
我必须为我收到的每个这样的消息分配一个相应的属性事件处理程序。并且这些事件必须在主线程的上下文中传递。我知道两个这样的解决方案:
第一个是好的,但它需要一个窗口句柄。由于这是一个库代码,因此没有句柄可用。 AllocateHWND不是一个选项,因为它不是跨平台的。我知道我可以创建一个虚拟表单,但这是一个非常糟糕的解决方案
第二个工作正常,但我有一个问题,就是在我在应用程序中移动鼠标之前不会处理调用。也许我做错了什么我不知道。我就像我的电话只在消息处理开始时才被处理。但这显然是一个漫长的等待。
所以我想知道这里最好的解决方案是什么(可能是QueueAsyncCall),以及如何确保我的消息(调用)将在可接受的时间范围内处理?
答案 0 :(得分:1)
你无法100%确定,就像你不能在任何非实时系统中一样。如果mainthread挂起,则不会检查主循环中的消息或其他事件。这很正常。
你唯一能做的就是避免在主线程中做一些可能需要很长时间的事情。这是交易的诀窍,准确地判断什么是必要的,什么不是。一些面向实时的人将所有文件系统访问权限移动到线程,并严格保持GUI用于UI,只是因为如果用户为此网络共享网络共享上的路径,共享问题很容易导致超时等待,几分钟甚至。
如果我查看application.queueasynccall,我看到没有线程安全处理(没有锁定或锁定队列),所以一个就出来了。
我知道Lazarus在某种程度上在非Windows上模仿postmessage,我检查了实现,它确实有锁,所以我认为它是多线程安全的。