【问题标题】:How to pass data(structure) as a message to a thread.如何将数据(结构)作为消息传递给线程。
【发布时间】:2012-10-14 06:29:22
【问题描述】:

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

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

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

【问题讨论】:

    标签: c winapi message-queue


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          编辑:

          没有意识到已经有消息队列,抱歉,那么动态分配的消息当然可以。

          旧答案供参考:

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

          工作线程:

          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 之类的东西

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-04-17
            • 2021-06-30
            • 1970-01-01
            • 1970-01-01
            • 2010-11-14
            • 2020-05-04
            • 1970-01-01
            • 2012-01-07
            相关资源
            最近更新 更多