![]() |
1
36
编辑: 看起来自Delphi4和Delphi5(我大部分工作仍在使用Delphi4和Delphi5版本)以来,许多实现细节都发生了变化,AllenBauer评论了以下内容:
谢谢你的纠正。所以,用一粒盐把原始答案中的细节记下来。
但这并不真正影响核心点。我仍然认为
你在这里所呈现的完全不是另一种选择,因为
它是如何工作的?它使用了
所以,它有什么问题(以及使用它同样有什么问题)
那么用什么来代替呢?我将介绍几个选项:
编辑:
重新阅读时,我意识到你不打算使用
如果您每隔一秒或更长的时间发布来自每个线程的消息,那么设计就可以了。您不应该做的是每秒每线程发送数百条或更多的消息,因为Windows消息队列的长度有限,自定义消息不应太多地干扰正常的消息处理(您的程序将开始看起来没有响应)。
窗口消息不能包含记录。它有两个参数,一个是类型
没有必要这样做,因为
|
![]() |
2
9
顺便说一句,你也可以用
(
我更喜欢
|
![]() |
3
5
虽然我确信有正确的方法和错误的方法。我已经用这两种方法编写了代码,我一直返回的方法是sendmessage方法,我不知道为什么。 sendmessage与synchronize的使用实际上没有任何区别。两者的工作原理基本相同。我认为我一直使用sendmessage的原因是我感觉到了更多的控制,但我不知道。 sendmessage例程使调用线程暂停并等待,直到目标窗口完成对发送的消息的处理。因此,在调用期间,主应用程序线程基本上与调用子线程同步。您不需要使用Windows消息处理程序中的关键部分。 从调用线程到主应用程序线程,数据传输本质上是一种方式。您可以在message.result中返回一个整型值,但不能指向主线程中的内存对象。 因为这两个线程是“同步”的,所以现在主应用程序线程被绑定在对sendmessage的响应上,所以您也不需要担心其他线程同时进入和破坏您的数据。所以不需要担心使用关键部分或其他类型的线程安全措施。 对于简单的事情,您可以定义单个消息(wm_threadmsg1),并使用wparam和lparam字段来回传输(integer)状态消息。对于更复杂的示例,您可以通过lparam传递字符串并将其类型化为longnt来传递字符串。a-la longint(pchar(myvar))或使用pwidechar(如果您使用的是d2009或更新版本)。 如果您已经让它与同步方法一起工作了,那么我就不必担心修改它来进行更改。 |