我有三个类(class):
class Rtss_Generator {
int mv_transfersize;
}
class Rtss_GenSine : Rtss_Generator
class Rtss_GenSineRpm : Rtss_GenSine
Rtss_GenSine 在他的构造函数中创建了一个线程,它被立即启动并且线程函数被声明为静态的,等待一个事件开始计算。
问题:通过gen-pointer访问的所有变量都是0,但是并没有失败。另外,构造函数中的this-address和线程中的gen-pointer-address是一样的,所以指针是可以的。
此代码是在 Visual Studio 6.0 Service Pack 2003 中创建和编译的
原始代码
no thread
Rtss_GenSine::getNextData() {
//[CALCULATION]
//mv_transferSize is accessible and has ALWAYS value 1600 which is ok
}
新代码
Rtss_GenSine::Rtss_GenSine() {
createThread(NULL, threadFunction, (LPVOID) this,0,0);
}
Rtss_GenSine::getNextData() {
SetEvent(startCalculating);
WaitForSingleObject(stoppedCalculaing, INFINITE);
}
DWORD Rtss_GenSine::threadFunction(LPVOID pParam) {
Rtss_GenSine* gen = (Rtss_GenSine*) pParam;
while(runThread) {
WaitForSingleObject(startCalculating, INFINITE);
ResetEvent(startCalculating)
//[CALCULATION]
//gen->mv_transferSize ---> it does not fail, but is always zero
//all variables accessed via the gen-pointer are 0
setEvent(stoppedCalculaing)
}
}
最佳答案
也许你正在做这样的事情:
Rtss_GenSize someFunc()
{
Rtss_GenSize temp;
return temp;
}
Rtss_GenSine mygensize = some_func();
在这种情况下,构造函数在一个临时实例上被调用一次,复制构造函数被调用以将其复制到 mygensize(两次),使得“this”对生成的线程没有好处。
这可能是问题所在...如果您发布创建 Rtss_GenSine 实例的代码将有助于调查...
关于C++ this作为线程参数,变量不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2822401/