簡體   English   中英

從pthread訪問外部類變量

[英]accessing extermal class variables from pthread

我正在用C ++編寫一個程序,要求我使用幾個類和線程來解決當前的問題。 這是一個簡化的片段:

主類:初始化eth_controllerpt_proc_data並調用以啟動工作線程StartParsePacket

class MFA_MAIN : public QMainWindow
    {
        Q_OBJECT
    public:
        MFA_MAIN(QWidget *parent = 0);
        ~MFA_MAIN();
    private:
        Ui::MFA_MAINClass ui;
        eth_controller* eth;
        pt_proc_data *pd;
    }
    MFA_MAIN::MFA_MAIN(QWidget *parent)
        : QMainWindow(parent)
    {
        eth = new eth_controller(ui.txtStatus, ui.cmbEthernetPort);
        pd = new pt_proc_data(PSD, eth, this);
        pd->StartParsePacket(ui.txtStatus);
    }

在此階段,僅初始化了以太網類,因此bool ok設置為false指示設備處理程序尚未正確設置:

class eth_controller : public QThread
{
    Q_OBJECT

public:
    eth_controller(QPlainTextEdit * status, QComboBox* list);
    ~eth_controller();
    bool ok;
}
eth_controller::eth_controller(QPlainTextEdit * status, QComboBox* list)
{
    ok = false;
......
}

Worker Class:他將啟動一個新的pthread來開始解析。 但是首先,他檢查ethernet類中的ok變量是否正確設置:

class pt_proc_data 
{
public:
    pt_proc_data(data_ty t, eth_controller *e, QObject *g);
    ~pt_proc_data();

    //thread
    void *doParsePacket();
    //thread heplers
    static void *hParsePacket(void* ctx);
    //thread starters
    void StartParsePacket(QPlainTextEdit *status);


 private:
        //plot bins
....
        //parsing tools
        eth_controller *eth;
        vector<S> PayQueue;
        QObject* ptr_gui;

    //thread control
    pthread_t threads[3];
    bool init[3];
    pthread_mutex_t PlotLock;
    pthread_mutex_t QueueLock;
    pthread_mutex_t ResetLock;
    pthread_mutex_t ToggleLock;
    data_ty _type;
    bool _running = false;
    bool _end = false;
    int _freq;
    ofstream fd;
    bool _log;
}

pt_proc_data::pt_proc_data(data_ty t, eth_controller *e, QObject* g)
{
    _type = t; eth = e; ptr_gui = g;
}
void pt_proc_data::StartParsePacket(QPlainTextEdit *status)
{
    int rc;
    if (pthread_create(&threads[0], NULL, &pt_proc_data::hParsePacket, this)) {
        status->appendPlainText("StartParsePacket Error:unable to create thread");
        return;
    }
    return;
}
void *pt_proc_data::hParsePacket(void* ctx)
{
    pt_proc_data *context = static_cast<pt_proc_data*>(ctx);
    context->doParsePacket();
    delete context;
    return 0;
    //return ((pt_proc_data *)ctx)->doParsePacket();
}
void *pt_proc_data::doParsePacket()
{
    if (!eth->ok)
    {
        QMetaObject::invokeMethod(ptr_gui, "setStatusText",
            Q_ARG(QString, "payload download: Device not setup correctly."));
        pthread_exit(NULL);
    }
    QMetaObject::invokeMethod(ptr_gui, "setStatusText",
        Q_ARG(QString, "doParsePacket: started."));
.......
}

線程已正確啟動。 在此階段,設備安裝不正確,因此doParsePacket()應該始終找到eth->ok = false並抱怨設備安裝不正確。 但是,如果我啟動該程序10次,4-5次,它將發現eth->ok的值是true

我想知道有人能告訴我為什么會這樣。 謝謝

好。 我找到了解決方案。 我宣布bool ok; 作為private並添加了bool isOk() {return ok;}; 而且現在似乎正在工作。

但是我不明白為什么會這樣。 也許有人可以闡明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM