如何将数据(结构)作为消息传递给线程。

时间:2012-10-24 08:28:01

标签: c winapi message-queue

如何将数据从主应用程序传递到线程?

在主应用程序中,我创建了一个处理错误消息的线程。在主应用程序中处理数据时,如果出现错误,则会生成错误消息并将其填入结构中。需要将此错误消息(结构)传递给线程,然后线程将进一步处理它,主应用程序应继续其工作。我试图在Windows平台上的C中这样做。

我的应用程序中只会运行一个线程。目前我已经定义了一个全局变量结构(myData),我正在使用 PostThreadMessage传递它。

struct myData errorData;

从主应用程序发布消息

PostThreadMessage(ErrorLogId, THRD_MESSAGE_EXIT , 0 , (LPARAM)&errorData);

在我有的帖子中

MsgReturn = GetMessage(&msg, NULL, THRD_MESSAGE_SOMEWORK, THRD_MESSAGE_EXIT);

目前工作正常。但是,如果处理错误消息需要更多时间,那么主应用程序可能会在全局结构errorData中获得新错误并更新数据。

我可以使用锁定机制但是在线程完成处理之前我无法停止主应用程序。如何在不将数据作为全局变量的情况下传递数据?

4 个答案:

答案 0 :(得分:2)

您可能希望在每次打电话struct myData时创建PostThreadMessage()的新实例。

完成后,线程需要free()struct myData实例。

当主要任务继续时,向当前方法添加同步将违反产生工作者的异步概念。

无论如何,如果在共享日志文件中写入内容,线程仍然需要使用同步。

答案 1 :(得分:1)

解决方案是每次动态分配struct myData(使用malloc()),填充它并将其传递给线程进行处理。一旦完成处理,该线程负责free()

此方法删除全局对象errorData上的线程之间的任何同步(因为不再需要)。

答案 2 :(得分:1)

如何动态分配错误消息(使用malloc()),填充它并将指针传递给消息中的线程?然后该线程将使用该消息并取消分配它(使用free())。

答案 3 :(得分:0)

修改

没有意识到已经有了一个消息队列,对不起,那么动态分配的消息当然会有用。

旧答案供参考:

如果您不希望等到线程完成处理错误消息,那么您应该使用同步队列进行主线程和工作线程之间的通信。这是一些伪代码来解释我的意思:

工作线程

while (queue_is_empty())
  wait;
lock(queue);
process_error(read(queue));
unlock(queue);

主线程

if (error)
  lock(queue)
  write(queue, error)
  unlock(queue)
  //possibly signal thread

您不必从头开始实现,您可以使用RabbitMQ

之类的东西