我正在尝试编写一个相当简单的 C++ 程序。它分为三个部分:
- 串口客户端:应该连续轮询一个串口服务器并将接收到的值保存在一个表中,有一个无限的for循环来继续轮询串口服务器
- 记录:将当前表值写入 .csv 文件,每隔几秒添加一个时间戳
- 菜单:用于启动/停止服务器和退出程序的简单命令行菜单
我曾尝试使用 pthread 和 boost::thread 使这三个函数同时发生,但运气不佳。
任何人都可以为我提供一些关于这一切的方向,我是线程的新手,也许线程甚至不是正确的方法。
我正在尝试编写一个相当简单的 C++ 程序。它分为三个部分:
我曾尝试使用 pthread 和 boost::thread 使这三个函数同时发生,但运气不佳。
任何人都可以为我提供一些关于这一切的方向,我是线程的新手,也许线程甚至不是正确的方法。
这是一种执行您要求的方法:
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;
}
互斥锁对于避免在不同线程中同时访问表是必要的。
这是一个非常常见的情景。
通常,您的应用程序将有一个主线程,它将:
然后串行连接将有一个监听线程。当在串行连接上接收到数据时,它将触发一个数据接收事件,该事件将由主应用程序处理。通常,您会使用许多可用的库对象之一来简化串行端口通信。这将使您无需自己设置和管理监听线程。在这种情况下,您只需将应用程序事件处理程序连接到串行端口处理程序对象 DataReceived 事件。在 C++ 世界中,这里最有可能的候选者是Boost.Asio。这里还有一个不错的串口通信对象的实现,这里有一篇很好的支持文章:CodeProject Serial library for C++。
如果事件处理程序(在串行侦听线程上调用)和主应用程序线程都在访问一些共享数据(您提到的数据表),那么您将需要使用同步原语(例如,CriticalSection、Mutex 等)保护对该对象的访问以避免并发访问(一个线程(串行侦听线程)写入或添加到数据结构,而另一个线程(主应用程序线程)正在读取或从中提取数据结构)。