1

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

在主应用程序中,我创建了一个线程来处理错误消息。在主应用程序中处理数据时,如果出现错误,它会生成错误消息并将其填充到结构中。此错误消息(结构)需要传递给线程,然后线程将进一步处理它,主应用程序应继续其工作。我正在尝试在 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

4 回答 4

2

您可能希望在struct myData每次要调用时创建一个新实例PostThreadMessage()

线程在完成时需要free()这个实例。struct myData

在您当前的方法中添加同步将违反在主要任务继续时生成工作人员的异步概念。

无论如何,线程仍然需要在他们身边使用同步,以防将某些内容写入共享日志文件。

于 2012-10-24T08:34:33.020 回答
1

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

这种方法消除了全局对象上线程之间的任何同步errorData(因为它不再需要)。

于 2012-10-24T08:34:03.047 回答
1

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

于 2012-10-24T08:34:38.010 回答
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之类的东西

于 2012-10-24T08:34:19.877 回答