[英]accessing extermal class variables from pthread
我正在用C ++編寫一個程序,要求我使用幾個類和線程來解決當前的問題。 這是一個簡化的片段:
主類:初始化eth_controller
和pt_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.