我正在使用CWinThread
。我已经让主GUI在LPARAM
中向线程发送了一个数组。例如,此代码 WORKS :
//On GUI
char *headData = "L1";
PostThreadMessage(threadID,SEND_HEAD, 0, (LPARAM)head);
在帖子上:
void CMyThread::OnSendhead( WPARAM, LPARAM lParam){
char *head = (char*)lParam;
if (strcmp(head,"L1")==0){
//This line is reached.
}
return;
}
但是当我在这里做一点改变时:
char *head = "L1"
unsigned char byteHead[3];
memcpy(byteHead, head, 3);
PostThreadMessage(threadID,SEND_HEAD, 0, (LPARAM)byteHead);
在帖子上:
void CMyThread::OnSendhead( WPARAM, LPARAM lParam){
unsigned char* byteHead = (unsigned char*)lParam;
char head[3];
memcpy(head, byteHead,3);
head[3] = '\0';
if (strcmp(head,"L1")==0){
//This line is nerver reached.
}
return;
}
if
内的行未到达。我已经将线程上的代码移动到GUI进行测试(没有转换为LPARAM),并且外包工作。所以我想我不能在lParam
和unsigned char*
之间进行投射?为什么,我该怎么做?谢谢你们
答案 0 :(得分:4)
PostMessage
不会立即处理消息,但会留下消息循环以便稍后提取。如果lparam
指向的数据在此期间被破坏,那么它将会失败。
在第一个示例中,您传递的是字符串文字。字符串文字往往在程序的整个生命周期内保持有效,所以这没关系。
在第二个示例中,您使用的是一个本地变量,可能会在您执行PostMessage
后很快被破坏。
要完成这项工作,请改用SendMessage
;它会立即得到处理。或者使用保证在处理消息之前有效的变量。
答案 1 :(得分:1)
使用PostMessage
或PostThreadMessage
,您应始终使用堆分配的内存来发送数据,小到bool
,并在消息处理函数中删除它。您可以将消息包装在某些struct
中,例如:
struct MyMsg
{
int msgCode; // specific to you, and you know underlying datatype
char buffer[1024]; // or have a `vector` or dynamic-array you'd manage
};
<强>发件人:强>
MyMsg* msg = new MyMsg;
msg->msgCode = 0x1; // It's a string
strcpy_s(msg->buffer, "abc");
PostThreadMessage(threadID,SEND_HEAD, 0, (LPARAM)msg);
<强>接收机强>:
void CMyThread::OnSendhead( WPARAM, LPARAM lParam)
{
MyMsg* msg= (MyMsg*)lParam;
// use msg
delete msg;
}