使用MFC,将变量与消息一起发布到线程

时间:2016-05-19 03:35:33

标签: c++ multithreading casting mfc

我正在使用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),并且外包工作。所以我想我不能在lParamunsigned char*之间进行投射?为什么,我该怎么做?谢谢你们

2 个答案:

答案 0 :(得分:4)

PostMessage不会立即处理消息,但会留下消息循环以便稍后提取。如果lparam指向的数据在此期间被破坏,那么它将会失败。

在第一个示例中,您传递的是字符串文字。字符串文字往往在程序的整个生命周期内保持有效,所以这没关系。

在第二个示例中,您使用的是一个本地变量,可能会在您执行PostMessage后很快被破坏。

要完成这项工作,请改用SendMessage;它会立即得到处理。或者使用保证在处理消息之前有效的变量。

答案 1 :(得分:1)

使用PostMessagePostThreadMessage,您应始终使用堆分配的内存来发送数据,小到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;
}