【发布时间】:2015-04-01 07:34:57
【问题描述】:
我有一个应用程序,它使用三个辅助线程从数据库中读取数据(3 个不同的表,总共约 160,000 行),从这些行创建对象,然后将对象添加到两个列表之一,具体取决于什么类型对象的创建。帮助线程通过 SendMessage 调用将对象添加到列表中,以便主线程是唯一在列表中添加/删除的对象。
奇怪的是 SendMessage 并不总是成功,我会经常收到这两个错误 ERROR_ALREADY_EXISTS (183) 和 ERROR_TRUSTED_DOMAIN_FAILURE (1788)。 SendMessage 调用的函数只是将一个对象添加到列表中,并且此函数始终返回成功(0)。没有创建文件(正如 ERROR_ALREADY_EXISTS 似乎暗示的那样),也没有网络调用,所以我不确定为什么会收到 ERROR_TRUSTED_DOMAIN_FAILURE 错误。
关于可能导致这些错误的原因或调试这些错误的任何方法的任何想法?
请注意,在使用 SendMessage 之前,我使用的是 PostMessage,会收到很多 ERROR_NOT_ENOUGH_QUOTA 错误; SendMessage 使该实用程序工作得更好。
【问题讨论】:
-
如果我使用 PostMessage,我还能使用 GetLastError() 吗?我喜欢线程安全的数组方法,谢谢。
-
@HansPassant 你这是什么意思?它说我仍在处理“非排队传入消息”的部分(是其他
SendMessage()s 吗?)? -
这仅适用于工作线程创建自己的窗口并具有消息队列的情况。不太可能在这里申请。
-
@HansPassant 那么我在文档中缺少什么说非系统消息不是线程安全的?还是我们区分线程安全和阻止调用线程运行?
-
发送到另一个进程的非系统消息不能包含指针,因为它们不会自动编组到目标进程的地址空间。但是,在发送者自己的进程中发送的非系统消息可以包含指针,并且应该是线程安全的,因为发送代码在接收窗口过程完成处理消息之前被阻塞。
标签: winapi visual-c++