Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;程序线程概念 我试图写一个相当简单的C++程序。它由三部分组成: 串行客户端:应连续轮询串行服务器并将收到的值保存在表中,具有无限for循环以继续轮询串行服务器 日志记录:每隔几秒钟将当前表值写入带有时间戳的.csv文件 菜单:启动/停止服务器并退出程序的简单命令行菜单_C++_Multithreading - Fatal编程技术网

C++;程序线程概念 我试图写一个相当简单的C++程序。它由三部分组成: 串行客户端:应连续轮询串行服务器并将收到的值保存在表中,具有无限for循环以继续轮询串行服务器 日志记录:每隔几秒钟将当前表值写入带有时间戳的.csv文件 菜单:启动/停止服务器并退出程序的简单命令行菜单

C++;程序线程概念 我试图写一个相当简单的C++程序。它由三部分组成: 串行客户端:应连续轮询串行服务器并将收到的值保存在表中,具有无限for循环以继续轮询串行服务器 日志记录:每隔几秒钟将当前表值写入带有时间戳的.csv文件 菜单:启动/停止服务器并退出程序的简单命令行菜单,c++,multithreading,C++,Multithreading,我曾尝试使用pthread和boost::thread使这三个函数同时出现,但运气不太好 有谁能给我一点关于这一切的指导吗,我对线程技术还不熟悉,也许线程技术在这里甚至不是正确的方法。这是一个非常常见的问题 通常,应用程序的主线程将: 设置串行连接 驱动菜单(用户输入等) 串行连接将有一个侦听线程。当通过串行连接接收数据时,它将触发一个数据接收事件,该事件将由主应用程序处理。通常,您会使用许多可用的库对象中的一个来简化串行端口通信。这将减少你自己设置和管理监听线程的工作量。在这种情况下,您只需将

我曾尝试使用pthread和boost::thread使这三个函数同时出现,但运气不太好


有谁能给我一点关于这一切的指导吗,我对线程技术还不熟悉,也许线程技术在这里甚至不是正确的方法。

这是一个非常常见的问题

通常,应用程序的主线程将:

  • 设置串行连接
  • 驱动菜单(用户输入等)
  • 串行连接将有一个侦听线程。当通过串行连接接收数据时,它将触发一个数据接收事件,该事件将由主应用程序处理。通常,您会使用许多可用的库对象中的一个来简化串行端口通信。这将减少你自己设置和管理监听线程的工作量。在这种情况下,您只需将应用程序事件处理程序连接到串行端口处理程序对象DataReceived事件。在C++世界里,最有可能的是这里的烛光。这里还有一篇很好的串口通信对象实现,并提供了一篇很好的支持文章:


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

    以下是一种方法,可以满足您的要求:

    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;
    }
    
    boost::mutex-mtx;
    void poll_thread()
    {
    而(!完成){
    轮询_以获取_数据();
    如果(接收到数据){
    boost::唯一锁定(mtx);
    //将数据写入表
    }
    }
    }
    无效日志_线程()
    {
    而(!完成){
    睡眠(1);
    boost::唯一锁定(mtx);
    //将表记录到csv文件。。。
    }
    }
    int main()
    {
    //创建并启动轮询和日志线程
    boost::线程th1(&poll_线程);
    boost::线程th2(&log_线程);
    //运行菜单
    而(!完成){
    //...
    }
    th1.join();
    th2.join();
    返回0;
    }
    

    互斥锁是避免在不同线程中同时访问表所必需的。

    请发布您尝试过的代码的相关部分,以便人们可以告诉您它有什么问题。它应该与
    pthreads
    一起使用。只要把代码中你觉得出错的地方贴出来就行了。[Psst!在关闭之前要快一点]创建线程实际上不需要boost。为什么不使用API来创建线程?