C++ GTKMM和boost.asio

C++ GTKMM和boost.asio,c++,boost,gtkmm,C++,Boost,Gtkmm,我试图用gtkmm编写一个简单的应用程序,它将显示从串行端口接收到的值。我使用的是在这里找到的AsyncSerial类-。这些类在命令行上对我来说都很好,但我无法让它们在gtkmm中更新标签。当我调用函数start_serial_read()时,lblMass接收到一个空字符串,没有输出任何内容。如果我在函数中停止程序并单步执行,scaleReading将被指定正确的值,并且读数将被输出。你知道我遗漏了什么吗?我尝试使用glib::sleep(50)来给时间阅读数据,但没有成功。谢谢 #incl

我试图用gtkmm编写一个简单的应用程序,它将显示从串行端口接收到的值。我使用的是在这里找到的AsyncSerial类-。这些类在命令行上对我来说都很好,但我无法让它们在gtkmm中更新标签。当我调用函数start_serial_read()时,lblMass接收到一个空字符串,没有输出任何内容。如果我在函数中停止程序并单步执行,scaleReading将被指定正确的值,并且读数将被输出。你知道我遗漏了什么吗?我尝试使用glib::sleep(50)来给时间阅读数据,但没有成功。谢谢

#include "FrmMain.h"
#include "AsyncSerial.h"
#include "BufferedAsyncSerial.h"
#include <iostream>
#include <boost/thread.hpp>
#include <string>
#include <gtkmm.h>

using namespace std;
using namespace Gtk;


FrmMain::FrmMain()
      : btnOk("OK"),
        btnCancel("Cancel"),
        labelSentStatus(""),
        lblMass("0.0"),
        timeout_value(1500), // 1500 ms = 1.5 seconds 
        vBox1(Gtk::ORIENTATION_VERTICAL),
        hBox1(Gtk::ORIENTATION_HORIZONTAL),
        hBox2(Gtk::ORIENTATION_HORIZONTAL),
        hBox3(Gtk::ORIENTATION_HORIZONTAL),
        hBox4(Gtk::ORIENTATION_HORIZONTAL)
{       
        set_title("Additives");
        set_border_width(10);

        hBox1.pack_start(lblMass, Gtk::PACK_SHRINK);    //pack mass reading into top box
        vBox1.pack_start(hBox1, Gtk::PACK_SHRINK);      //pack top box       
        vBox1.pack_start(hBox2, Gtk::PACK_SHRINK);      //pack empty space
        hBox3.pack_start(btnOk, Gtk::PACK_SHRINK);      //pack OK button into hBox3
        hBox3.pack_start(btnCancel, Gtk::PACK_SHRINK);      //pack cancel button into hBox3
        vBox1.pack_start(hBox3, Gtk::PACK_SHRINK);      //pack hbox3
        vBox1.pack_start(hBox4, Gtk::PACK_SHRINK);      //pack hbox3
        add(vBox1);

        btnOk.signal_clicked().connect(sigc::mem_fun(*this, &FrmMain::on_ok_button_clicked));
    btnCancel.signal_clicked().connect(sigc::mem_fun(*this, &FrmMain::on_cancel_button_clicked));
        sigc::slot<bool> timeoutSlot = sigc::mem_fun(*this, &FrmMain::start_serial_read);
        sigc::connection conn = Glib::signal_timeout().connect(timeoutSlot,timeout_value);
        show_all_children();  
}

void FrmMain::on_ok_button_clicked(){
    labelSentStatus.set_text("Sent");
}

void FrmMain::on_cancel_button_clicked(){
    labelSentStatus.set_text("");
}

bool FrmMain::start_serial_read()
{   
    try {
        BufferedAsyncSerial serial("/dev/ttyUSB0",4800);
        {
            //Return immediately. String is written *after* the function returns,
            //in a separate thread.
            //serial.writeString("Hello world\r\n");
            string scaleReading = serial.readStringUntil("\r");           
            lblMass.set_text(scaleReading);
            cout<<serial.readStringUntil("\r")<<endl;           
            serial.close();
            return true;
        }
    } catch(boost::system::system_error& e)
    {
        cout<<"Error: "<<e.what()<<endl;
        return true;
    }
}
#包括“FrmMain.h”
#包括“AsyncSerial.h”
#包括“BufferedAsyncSerial.h”
#包括
#包括
#包括
#包括
使用名称空间std;
使用名称空间Gtk;
FrmMain::FrmMain()
:btnOk(“正常”),
取消(“取消”),
标签状态(“”),
lblMass(“0.0”),
超时值(1500),//1500毫秒=1.5秒
vBox1(Gtk::方向\垂直),
hBox1(Gtk::方向\水平),
hBox2(Gtk::水平方向),
hBox3(Gtk::方向\水平),
hBox4(Gtk::方向\水平)
{       
设置标题(“添加剂”);
设置边框宽度(10);
hBox1.pack_start(lblMass,Gtk::pack_SHRINK);//将质量读数装入顶部框
vBox1.pack_start(hBox1,Gtk::pack_SHRINK);//pack top box
vBox1.pack_start(hBox2,Gtk::pack_SHRINK);//打包空空间
hBox3.pack_start(btnOk,Gtk::pack_SHRINK);//将OK按钮打包到hBox3中
hBox3.pack_start(btnCancel,Gtk::pack_SHRINK);//将pack cancel按钮放入hBox3
vBox1.pack_start(hBox3,Gtk::pack_SHRINK);//pack hBox3
vBox1.pack_start(hBox4,Gtk::pack_SHRINK);//pack hbox3
添加(vBox1);
btnOk.signal_clicked().connect(sigc::mem_fun(*这个,&FrmMain::on_ok_按钮_clicked));
btnCancel.signal_clicked().connect(sigc::mem_fun(*这个,&FrmMain::on_cancel_按钮_clicked));
sigc::slot timeoutSlot=sigc::mem\u fun(*这个,&FrmMain::开始串行读取);
sigc::connection conn=Glib::signal_timeout().connect(timeoutSlot,timeout_值);
显示所有子项();
}
void FrmMain::在“确定”按钮上单击(){
labelSentStatus.set_text(“已发送”);
}
void FrmMain::在“取消”按钮上单击(){
labelSentStatus.set_文本(“”);
}
bool FrmMain::启动\u串行\u读取()
{   
试一试{
BufferedAsyncSerial串行(“/dev/ttyUSB0”,4800);
{
//立即返回。字符串写在函数返回的*之后,
//在单独的线程中。
//serial.writeString(“Hello world\r\n”);
string scaleReading=serial.readStringUntil(“\r”);
lblMass.set_文本(缩放阅读);

cout我修复了这个问题,将timeout_值增加到2秒(timeout_值(2000)),并在信号处理程序中使用Gtk::sleep()函数为串行端口提供更多的读取时间。我以前尝试的最多的是timeout_值(1500)和sleep(0.5),结果是时间段太短。以下是更新的代码:

/*
 * FrmMain.cpp
 *
 *  Created on: Jun 17, 2017
 *      Author: tim
 */

#include "FrmMain.h"
#include "AsyncSerial.h"
#include "BufferedAsyncSerial.h"
#include <iostream>
#include <boost/thread.hpp>
#include <string>
#include <gtkmm.h>
#include <typeinfo>
using namespace std;
using namespace Gtk;


FrmMain::FrmMain()
      : btnOk("OK"),
        btnCancel("Cancel"),
        labelSentStatus(""),
        lblMass("0.0"),
        timeout_value(2000), // 1500 ms = 1.5 seconds 
        vBox1(Gtk::ORIENTATION_VERTICAL),
        hBox1(Gtk::ORIENTATION_HORIZONTAL),
        hBox2(Gtk::ORIENTATION_HORIZONTAL),
        hBox3(Gtk::ORIENTATION_HORIZONTAL),
        hBox4(Gtk::ORIENTATION_HORIZONTAL)

{       
        set_title("Additives");
        set_border_width(10);
        hBox1.pack_start(lblMass, Gtk::PACK_SHRINK);    //pack mass reading into top box
        vBox1.pack_start(hBox1, Gtk::PACK_SHRINK);      //pack top box       
        vBox1.pack_start(hBox2, Gtk::PACK_SHRINK);      //pack empty space
        hBox3.pack_start(btnOk, Gtk::PACK_SHRINK);      //pack OK button into hBox3
        hBox3.pack_start(btnCancel, Gtk::PACK_SHRINK);      //pack cancel button into hBox3
        vBox1.pack_start(hBox3, Gtk::PACK_SHRINK);      //pack hbox3
        vBox1.pack_start(hBox4, Gtk::PACK_SHRINK);      //pack hbox3
        add(vBox1);
        btnOk.signal_clicked().connect(sigc::mem_fun(*this, &FrmMain::on_ok_button_clicked));
    btnCancel.signal_clicked().connect(sigc::mem_fun(*this, &FrmMain::on_cancel_button_clicked));
        sigc::slot<bool> timeoutSlot = sigc::mem_fun(*this, &FrmMain::start_serial_read);
        Glib::signal_timeout().connect(timeoutSlot,timeout_value);
        show_all_children();  
}

FrmMain::~FrmMain(){

}

void FrmMain::on_ok_button_clicked(){
    labelSentStatus.set_text("Sent");
}

void FrmMain::on_cancel_button_clicked(){
    labelSentStatus.set_text("");
}

bool FrmMain::start_serial_read()
{   
    try {
        BufferedAsyncSerial serial("/dev/ttyUSB0",4800);
        sleep(1);
        //boost::this_thread::sleep(boost::posix_time::seconds(2));
        //Return immediately. String is written *after* the function returns,
        //in a separate thread.
        //serial.writeString("Hello world\r\n");
        string scaleReading = serial.readStringUntil("\r");   
        lblMass.set_text(scaleReading);
        cout<<scaleReading("\r")<<endl;           
        serial.close();
        return true;

    } catch(boost::system::system_error& e)
    {
        cout<<"Error: "<<e.what()<<endl;
        return true;
    }
}
/*
*FrmMain.cpp
*
*创建日期:2017年6月17日
*作者:蒂姆
*/
#包括“FrmMain.h”
#包括“AsyncSerial.h”
#包括“BufferedAsyncSerial.h”
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
使用名称空间Gtk;
FrmMain::FrmMain()
:btnOk(“正常”),
取消(“取消”),
标签状态(“”),
lblMass(“0.0”),
超时值(2000),//1500毫秒=1.5秒
vBox1(Gtk::方向\垂直),
hBox1(Gtk::方向\水平),
hBox2(Gtk::水平方向),
hBox3(Gtk::方向\水平),
hBox4(Gtk::方向\水平)
{       
设置标题(“添加剂”);
设置边框宽度(10);
hBox1.pack_start(lblMass,Gtk::pack_SHRINK);//将质量读数装入顶部框
vBox1.pack_start(hBox1,Gtk::pack_SHRINK);//pack top box
vBox1.pack_start(hBox2,Gtk::pack_SHRINK);//打包空空间
hBox3.pack_start(btnOk,Gtk::pack_SHRINK);//将OK按钮打包到hBox3中
hBox3.pack_start(btnCancel,Gtk::pack_SHRINK);//将pack cancel按钮放入hBox3
vBox1.pack_start(hBox3,Gtk::pack_SHRINK);//pack hBox3
vBox1.pack_start(hBox4,Gtk::pack_SHRINK);//pack hbox3
添加(vBox1);
btnOk.signal_clicked().connect(sigc::mem_fun(*这个,&FrmMain::on_ok_按钮_clicked));
btnCancel.signal_clicked().connect(sigc::mem_fun(*这个,&FrmMain::on_cancel_按钮_clicked));
sigc::slot timeoutSlot=sigc::mem\u fun(*这个,&FrmMain::开始串行读取);
Glib::signal_timeout().connect(timeoutSlot,timeout_值);
显示所有子项();
}
FrmMain::~FrmMain(){
}
void FrmMain::在“确定”按钮上单击(){
labelSentStatus.set_text(“已发送”);
}
void FrmMain::在“取消”按钮上单击(){
labelSentStatus.set_文本(“”);
}
bool FrmMain::启动\u串行\u读取()
{   
试一试{
BufferedAsyncSerial串行(“/dev/ttyUSB0”,4800);
睡眠(1);
//boost::this_线程::sleep(boost::posix_时间::秒(2));
//立即返回。字符串写在函数返回的*之后,
//在单独的线程中。
//serial.writeString(“Hello world\r\n”);
string scaleReading=serial.readStringUntil(“\r”);
lblMass.set_文本(缩放阅读);

cout我修复了这个问题,将timeout_值增加到2秒(timeout_值(2000)),并在信号处理程序中使用Gtk::sleep()函数为串行端口提供更多的读取时间。我以前尝试的最多的是timeout_值(1500)和sleep(0.5),结果是时间段太短。以下是更新的代码:

/*
 * FrmMain.cpp
 *
 *  Created on: Jun 17, 2017
 *      Author: tim
 */

#include "FrmMain.h"
#include "AsyncSerial.h"
#include "BufferedAsyncSerial.h"
#include <iostream>
#include <boost/thread.hpp>
#include <string>
#include <gtkmm.h>
#include <typeinfo>
using namespace std;
using namespace Gtk;


FrmMain::FrmMain()
      : btnOk("OK"),
        btnCancel("Cancel"),
        labelSentStatus(""),
        lblMass("0.0"),
        timeout_value(2000), // 1500 ms = 1.5 seconds 
        vBox1(Gtk::ORIENTATION_VERTICAL),
        hBox1(Gtk::ORIENTATION_HORIZONTAL),
        hBox2(Gtk::ORIENTATION_HORIZONTAL),
        hBox3(Gtk::ORIENTATION_HORIZONTAL),
        hBox4(Gtk::ORIENTATION_HORIZONTAL)

{       
        set_title("Additives");
        set_border_width(10);
        hBox1.pack_start(lblMass, Gtk::PACK_SHRINK);    //pack mass reading into top box
        vBox1.pack_start(hBox1, Gtk::PACK_SHRINK);      //pack top box       
        vBox1.pack_start(hBox2, Gtk::PACK_SHRINK);      //pack empty space
        hBox3.pack_start(btnOk, Gtk::PACK_SHRINK);      //pack OK button into hBox3
        hBox3.pack_start(btnCancel, Gtk::PACK_SHRINK);      //pack cancel button into hBox3
        vBox1.pack_start(hBox3, Gtk::PACK_SHRINK);      //pack hbox3
        vBox1.pack_start(hBox4, Gtk::PACK_SHRINK);      //pack hbox3
        add(vBox1);
        btnOk.signal_clicked().connect(sigc::mem_fun(*this, &FrmMain::on_ok_button_clicked));
    btnCancel.signal_clicked().connect(sigc::mem_fun(*this, &FrmMain::on_cancel_button_clicked));
        sigc::slot<bool> timeoutSlot = sigc::mem_fun(*this, &FrmMain::start_serial_read);
        Glib::signal_timeout().connect(timeoutSlot,timeout_value);
        show_all_children();  
}

FrmMain::~FrmMain(){

}

void FrmMain::on_ok_button_clicked(){
    labelSentStatus.set_text("Sent");
}

void FrmMain::on_cancel_button_clicked(){
    labelSentStatus.set_text("");
}

bool FrmMain::start_serial_read()
{   
    try {
        BufferedAsyncSerial serial("/dev/ttyUSB0",4800);
        sleep(1);
        //boost::this_thread::sleep(boost::posix_time::seconds(2));
        //Return immediately. String is written *after* the function returns,
        //in a separate thread.
        //serial.writeString("Hello world\r\n");
        string scaleReading = serial.readStringUntil("\r");   
        lblMass.set_text(scaleReading);
        cout<<scaleReading("\r")<<endl;           
        serial.close();
        return true;

    } catch(boost::system::system_error& e)
    {
        cout<<"Error: "<<e.what()<<endl;
        return true;
    }
}
/*
*FrmMain.cpp
*
*创建日期:2017年6月17日
*作者:蒂姆
*/
#包括“FrmMain.h”
#包括“AsyncSerial.h”
#包括