gpt4 book ai didi

c - 当来自另一个线程的消息时,Winapi 控件不适本地访问内存

转载 作者:行者123 更新时间:2023-11-30 18:05:41 25 4
gpt4 key购买 nike

我知道我不应该从未创建控件的线程访问控件,但我还是尝试了它并得到了一个非常奇怪的错误。我是用汇编语言完成的,每个人都讨厌阅读汇编语言,所以这里是 C 语言中的等效代码:

/* Function that returns the number of characters after startOfItem
that are not some delimeter. startOfItem[maxSize] is guaranteed to
be at a valid address and to be a delimiter. The function is defined
elsewhere and works perfectly. */
unsigned int getSizeOfItem(char* startOfItem, unsigned int maxSize);

/* This function runs in a worker thread. It has an exception handler that is
omitted here for clarity, and because it is never run anyway. */
void itemizeAndAddToListbox (HWND hListbox, char* strings, unsigned int size) {
while (size) {
unsigned int sizeOfItem = getSizeOfItem(strings, size);
strings[sizeOfItem] = 0; //overwrite the delimiting character with null
SendMessage( hListbox, LB_ADDSTRING, (WPARAM) 0, (LPARAM) strings );
/* passing a pointer to a different thread is a no-no, but SendMessage
does not return until the message is processed, so no disposal issues
are possible. And I happen to know that all addresses from *strings
to strings[sizeOfItem] remain valid. */
strings += sizeOfItem+1;
size -= sizeOfItem+1;
};
}
不管你信不信,这在一个直到最后一项才创建 hListbox 的线程中完美地工作,此时列表框通过读取字符串 [size+1] 导致访问冲突。它在 UI 线程(创建列表框的线程)中抛出异常,忽略工作线程的异常处理程序。 SendMessage() 不适本地返回 0,而不是列表框错误代码。

我通过将用户定义的消息从工作线程发送到 UI 线程的窗口来完成这项工作,而 UI 线程的窗口又将具有相同参数的 LB_ADDSTRING 消息发送到相同的列表框,并且它工作得很好。当消息从 UI 线程发送时,异常尚未发生,但这是一个随机差异,我也对正确的工作代码感到紧张。有人知道列表框首先正在做什么访问超出字符串以空结尾结尾的内存,以及我可以采取什么措施来防止它这样做?

最佳答案

由于 SendMessage() 将调用序列化到接收线程,因此我预计异常会发生在 UI 线程上,因为这是添加字符串的线程。

MSDN 发送消息:'返回值指定消息处理的结果;这取决于发送的消息。这不是来自异常的列表框错误代码,除非消息处理程序将其放入消息字段,否则不会将其放入消息字段中。

如果您使用一个大小为 1 的字符串调用,最后的“size”会发生什么情况? 'size'不会被设置为-1,即。不是假的吗?

Rgds,马丁

关于c - 当来自另一个线程的消息时,Winapi 控件不适本地访问内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6171224/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com