2016-06-07 115 views
0

我创建了一个AsyncProgressWorker它创建一个实例并通过一个接口在我的C++ DLL中调用构造函数。 init创建一个永久工作的线程。逝去的罚款,到目前为止...NAN - AsyncProgressWorker已损坏成员

这是我nodeModul.cc

MyModule mod* = 0;  

NAN_METHOD(init) { 
    Nan::HandleScope scope; 

    ... doing stuff with the arguments 

    // create instance 
    mod = new MyModule(nanCallback, p1, p2, p3); 

    // queue the worker instance onto the thread-pool 
    Nan::AsyncQueueWorker(mod); 
} 

NAN_METHOD(setIntSetting) { 
    Nan::HandleScope scope; 

    if (mod) {   
    ... do the argument thing 

    mod->setIntSetting(p, v, r); 
    } 
    else { ... } 
} 

我已经添加了一些功能调用接口的方法。我想从现在开始转发正在运行的DLL线程应该使用的数据。

请找我MyModule.h

class MyModule : public Nan::AsyncProgressWorker { 
public: 
    // Constructor 
    SubvisMocker(Nan::Callback *callback, const long p1, const long p2, const long p3) : Nan::AsyncProgressWorker(callback) 
    , p1_(p1), p2_(p2), p3_(p3) 
{ 
    myMod = nullptr; 

    std::cout << "members: " << p1_ << "/" << p2_ << "/" << p3_ << std::endl; 

} 
// Destructor 
~MyModule() {} 

// Execute 
void Execute(const Nan::AsyncProgressWorker::ExecutionProgress &progress) { 

    if (!myMod) { 
     myMod = new ns::Dll_Object(); 

     myMod->init(p1_, p2_); 
    }    
    Sleep(200); 
} 

void HandleProgressCallback() { 
    std::cout << "ProgressCallback() - was called" << std::endl; 
} 

// Execution completed 
void HandleOKCallback() { 
    Nan::HandleScope scope; 
    callback->Call(0, NULL); 
} 

// 
// set method 
void setIntSetting(const int p, const int v, const int r) { 
    Nan::HandleScope scope; 
    std::cout << "members: " << p1_ << "/" << p2_ << "/" << p3_ << std::endl; 
    myMod->intSetting(p, v, r); 
} 
private: 
    long p1_; 
    long p2_; 
    long p3_; 

    ns::IDllObject* myMod; 

};

在AsyncProgressWorker的功能越来越调用,但不幸的是,指针运行实例(myMod)的DLL是腐败的所有情况下(同样像所有其他成员变量)95%。 5%的通话正在进行并且表现得应该如此。 setIntSetting中的cout大多是错误的,有时是正确的。

初始化被启动节点的应用程序,从而setIntSetting获取的FROM客户端GUI一个POST消息后叫后立即叫。

相同的结构和设计与另一个模块完美搭配,但那不是共享库。难道是,有问题吗?是不同的DLL的用法?

谢谢大家

回答

0

我发现,我是在开机后的应用程序直接调用初始化方法。从GUI调用setIntSetting正在使用不同的上下文(也许有更好的措辞)。所以从GUI调用init也解决了这个问题!但是仍然有趣的是指向myMod的指针是有效的。我最好不要将此指针存储为全局变量。

也许有人可以评论,我怎么得到指针,而不使用全局变量?比我还可以在每个打开的浏览器窗口中启动一个新实例,用户,无论如何...