我正在尝试编写一个相当简单的C ++程序。这分为三部分:
我曾尝试使用pthread和boost :: thread来使这三个函数同时发生,但是没有多少运气。
任何人都可以向我提供一些方向,我是线程新手,也许线程也不是正确的方式。
答案 0 :(得分: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;
}
互斥是必要的,以避免在不同的线程中同时访问表。
答案 1 :(得分:0)
这是一个非常常见的情景。
通常,您的应用程序将有一个主线程:
然后串行连接将有一个侦听线程。当在串行连接上接收数据时,它将触发将由主应用程序处理的数据接收事件。通常,您可以使用许多可用的库对象中的一个来简化串行端口通信。这样就可以完成设置和管理自己的监听线程的工作。在这种情况下,您只需将应用程序事件处理程序连接到串行端口处理程序对象DataReceived事件。在C ++世界中,最有可能的是Boost.Asio。还有一个不错的串口通信对象,这里有一篇很好的支持文章:CodeProject Serial library for C++。
如果事件处理程序(在串行侦听线程上调用)和主应用程序线程都在访问某些共享数据(您提到的数据表),那么您将需要使用同步原型(例如CriticalSection,Mutex,等)避免并发访问(一个线程(串行侦听线程)写入或添加到数据结构而另一个线程(主应用程序线程)正在读取或拉出它)。