2010-08-26 120 views
4

我必须在主线程的上下文中执行一些代码。我正在使用Lazarus + FPC。我从DLL中的线程(如果在Linux上共享库)收到一个事件,并且我的回调函数被调用。请注意,该函数不是任何类的成员,而是附带“cdecl”指令的独立传统函数。在主线程(Lazarus)的上下文中执行代码

我成通过靶向对于每个这样的消息我接收coresponding属性事件处理程序。这些事件必须在主线程中传递。我知道有两种这样的解决方案:

  1. PostMessage的
  2. Application.QueueAsyncCall

第一个是好的,但它需要一个窗口句柄。由于这是一个库代码,所以没有可用的句柄。 AllocateHWND不是一个选项,因为它不是跨平台的。我知道我可以创建一个虚拟的形式,但是这是一个非常糟糕的解决方案

第二工程确定,但我有一个问题,即呼叫没有处理,直到我移动鼠标内部的应用实例。也许我做错了我不知道的事情。我就像我的电话只在消息处理开始时才被处理。但是这显然可能很漫长。

所以我想知道什么是这里(可能QueueAsyncCall)最好的解决办法,我怎么能确定我的消息(呼叫)将在可接受的时间范围进行处理?

回答

1

你不能100%确定,就像你不能在任何非实时系统中一样。如果mainthread挂起,它不会检查主循环中的消息或其他事件。这个是正常的。

你能做的唯一的事情就是要避免在可能需要较长的时间mainthread做的东西。这是交易准确判断什么是必要的,什么不是的诀窍。一些以实时为导向的人将所有文件系统访问移动到线程,并严格保持GUI的UI,只是因为如果用户在网络共享上为其配置路径,共享的问题很容易导致超时等待,甚至分钟。

如果我看application.queueasynccall,我没有看到线程处理(无锁定或锁定队列),这样一方面是出于。

我知道PostMessage的是拉撒路模拟在一定程度上对非Windows和我检查了实现,它确实有锁,所以我认为它是多线程安全的。

+0

我很清楚,我不能100%确定,但我的应用程序没有做任何事情,直到我移动鼠标时才会处理这些调用。所以我更喜欢PostMessage。但缺点是AllocateHWND尚未跨平台实施。或者是?我认为Application.QueueAsyncCall是线程安全的。我会检查执行情况。但感谢您的答案。我在多线程环境方面有很多经验,但对于拉撒路来说我很新。因此,问题:) – Runner 2010-08-27 10:15:28

+0

恐怖:)它是trully在任何方式threadsafe。除了PostMessage,还有其他的消息吗?我的意思是简单的一个,没有IPC或TCP/IP? – Runner 2010-08-27 10:21:03

+0

不是。我假设他们经历了在其他平台上实施postmessage模拟的麻烦,原因之一是。 – 2010-08-27 13:06:15

相关问题