如何在辅助线程中使用闭合句柄 < >我使用Windows中的线程将C++中的插件连接到Python脚本。在会话期间,该线程将被多次调用

如何在辅助线程中使用闭合句柄 < >我使用Windows中的线程将C++中的插件连接到Python脚本。在会话期间,该线程将被多次调用,python,c++,multithreading,Python,C++,Multithreading,问题: 如果我在\u beginthread中传递ArgList,则会引发错误“xxx.exe中0x1E114A68(python27.dll)处未处理的异常:0xC0000005:访问冲突读取位置0xFFFFFE”。我想正是由于这个原因,我读入了Windows开发中心: 请注意,如果要在工作线程终止之前关闭其句柄,这不会终止工作线程。但是,该句柄将无法在后续函数调用中使用 关于这个错误的起源,我说得对吗?我如何克服这一点 代码: 我用NULL作为ArgList调用了\u beginthread

问题:

如果我在
\u beginthread
中传递
ArgList
,则会引发错误“xxx.exe中0x1E114A68(python27.dll)处未处理的异常:0xC0000005:访问冲突读取位置0xFFFFFE”。我想正是由于这个原因,我读入了Windows开发中心:

请注意,如果要在工作线程终止之前关闭其句柄,这不会终止工作线程。但是,该句柄将无法在后续函数调用中使用

关于这个错误的起源,我说得对吗?我如何克服这一点

代码:

我用
NULL
作为
ArgList
调用了
\u beginthread
,并在工作线程内定义了
ArgList
,只是为了让线程工作。以下是工作线程的代码:

注意:在调试时,我注意到未到达
\u endthread()
。这正常吗

void py_embed (void*data){

char *argv[4]={"PythonPlugIn2","bridge","test_callsign","MAH543"};
int argc=4;

ofstream textfile3;
textfile3.open("FP_python_embed.txt");

PyObject *pName, *pModule, *pDict, *pFunc, *pArgs, *pValue;
PyThreadState *mainThreadState,*myThreadState,*tempState;
PyInterpreterState *mainInterpreterState;

//To inform the interpreter about paths to Python run-time libraries
Py_SetProgramName(argv[0]);

// Initialize the Python Interpreter
Py_Initialize();

// Initialize thread support
PyEval_InitThreads();

// Save a pointer to the main PyThreadState object
mainThreadState = PyThreadState_Get();

// Get a reference to the PyInterpreterState
mainInterpreterState = mainThreadState->interp;

// Create a thread state object for this thread
myThreadState = PyThreadState_New(mainInterpreterState);

// Release global lock
PyEval_ReleaseLock();

// Acquire global lock
PyEval_AcquireLock();

// Swap in my thread state
tempState = PyThreadState_Swap(myThreadState);

// Build the name object
pName = PyString_FromString(argv[1]);

// Load the module object
pModule = PyImport_Import(pName);

// pDict is a borrowed reference 
pDict = PyModule_GetDict(pModule);

// pFunc is also a borrowed reference 
pFunc = PyDict_GetItemString(pDict, argv[2]);

//Do the Python things
PyObject *pArgs2, *pValue2;
pArgs2=Py_BuildValue("(s)",argv[3]);
pValue2 = PyObject_CallObject(pFunc, pArgs2);
textfile3<<PyInt_AsLong(pValue2)<<endl<<" worked1";
textfile3.close();

// Clean up
Py_DECREF(pModule);
Py_DECREF(pName);

// Swap out the current thread
PyThreadState_Swap(tempState);

// Release global lock
PyEval_ReleaseLock();

// Clean up thread state
PyThreadState_Clear(myThreadState);
PyThreadState_Delete(myThreadState);

// Finish the Python Interpreter
Py_Finalize();

_endthread();
};

注意:与此相关的问题1是

因此,我终于找到了问题所在。希望这能帮助那些和我有同样问题的人

<>我还不完全理解这是如何工作的,但是我基本上需要在C++中使用<代码>新< /C> >在代码堆上动态分配内存(和<代码> MalOC > C)。更多信息

在我的情况下,我需要这样做:

#define NUM_ARGUMENTS 4
typedef struct{
int argc;
char *argv[NUM_ARGUMENTS];
}SENDTOPY;
然后在主线程上:

SENDTOPY *cmd;

char *argv[4]={"PythonPlugIn2","bridge","test_callsign","MAH543"};
int i;

cmd= new SENDTOPY();
cmd->argc=4;
for( i = 0; i < NUM_ARGUMENTS; i++ )
{cmd->argv[i] = argv[i];}

handle=(HANDLE) _beginthread(py_embed,0,(void*)cmd);
SENDTOPY*cmd;
char*argv[4]={“PythonPlugIn2”、“bridge”、“test_callsign”、“MAH543”};
int i;
cmd=新的SENDTOPY();
cmd->argc=4;
对于(i=0;iargv[i]=argv[i];}
handle=(handle)_beginthread(py_embed,0,(void*)cmd);
我仍然需要更好地理解这一点,并学习如何在最后使用
delete
解除分配,但我的方法是正确的


注意:我仍然需要与此相关的帮助,请查看。

原因是在旧代码中,
cmd
仅存在于if语句的范围内。因此,一旦if语句结束,该内存将被回收-但由于您已将其内存地址指定给
句柄
,因此当
句柄
尝试对其进行操作时,会出现错误。如果您不想像以前那样进行手动内存管理,您还可以简单地将
cmd
的作用域提升为与
句柄
相同的范围,以便在
句柄
需要时保证数据存在。此外,如果您想要这两种解决方案的混合,您可以使用
作用域ptr
,您可以使用它自动处理动态分配对象的销毁。我已经手动使用了,但是,为了了解情况,我如何提高作用域?作用域只是程序中变量存在的深度。如果您有类似于
If(condition){SENDTOPY*cmd;…}
,则在If语句结束后,
*cmd
将消失。如果您执行
SENDTOPY*cmd;如果(条件){…}
*cmd
将一直存在,直到更大范围结束。
SENDTOPY *cmd;

char *argv[4]={"PythonPlugIn2","bridge","test_callsign","MAH543"};
int i;

cmd= new SENDTOPY();
cmd->argc=4;
for( i = 0; i < NUM_ARGUMENTS; i++ )
{cmd->argv[i] = argv[i];}

handle=(HANDLE) _beginthread(py_embed,0,(void*)cmd);