-1

我正在尝试编写一个相当简单的 C++ 程序。它分为三个部分:

  1. 串口客户端:应该连续轮询一个串口服务器并将接收到的值保存在一个表中,有一个无限的for循环来继续轮询串口服务器
  2. 记录:将当前表值写入 .csv 文件,每隔几秒添加一个时间戳
  3. 菜单:用于启动/停止服务器和退出程序的简单命令行菜单

我曾尝试使用 pthread 和 boost::thread 使这三个函数同时发生,但运气不佳。

任何人都可以为我提供一些关于这一切的方向,我是线程的新手,也许线程甚至不是正确的方法。

4

2 回答 2

1

这是一种执行您要求的方法:

boost::mutex mtx;

void poll_thread()
{
    while(!done) {
        poll_for_data();
        if(data_received) {
            boost::unique_lock<boost::mutex> lock(mtx);
            //write data to table
        }
    }
}

void log_thread()
{
    while(!done) {
        sleep(1);
        boost::unique_lock<boost::mutex> lock(mtx);
        //log table to csv file...
    }
}

int main()
{
    //create and start the polling and logging thread
    boost::thread th1(&poll_thread);
    boost::thread th2(&log_thread);

    //run the menu
    while(!done) {
        //...
    }

    th1.join();
    th2.join();

    return 0;
}

互斥锁对于避免在不同线程中同时访问表是必要的。

于 2013-05-09T12:43:10.167 回答
0

这是一个非常常见的情景。

通常,您的应用程序将有一个主线程,它将:

  1. 设置串行连接。
  2. 驱动菜单(用户输入等)

然后串行连接将有一个监听线程。当在串行连接上接收到数据时,它将触发一个数据接收事件,该事件将由主应用程序处理。通常,您会使用许多可用的库对象之一来简化串行端口通信。这将使您无需自己设置和管理监听线程。在这种情况下,您只需将应用程序事件处理程序连接到串行端口处理程序对象 DataReceived 事件。在 C++ 世界中,这里最有可能的候选者是Boost.Asio。这里还有一个不错的串口通信对象的实现,这里有一篇很好的支持文章:CodeProject Serial library for C++

如果事件处理程序(在串行侦听线程上调用)和主应用程序线程都在访问一些共享数据(您提到的数据表),那么您将需要使用同步原语(例如,CriticalSection、Mutex 等)保护对该对象的访问以避免并发访问(一个线程(串行侦听线程)写入或添加到数据结构,而另一个线程(主应用程序线程)正在读取或从中提取数据结构)。

于 2013-05-09T12:25:04.593 回答