如何在工作线程中使用关闭句柄

2024-01-04

我正在 Windows 中使用线程将 C++ 制作的插件连接到 python 脚本。该线程在会话期间将被多次调用

问题:

如果我通过了ArgList in the _beginthread错误“xxx.exe 中 0x1E114A68 (python27.dll) 处出现未处理的异常:0xC0000005:读取位置 0xFFFFFFFE 时发生访问冲突。”被提出,我想这是因为我读到的创建线程 http://msdn.microsoft.com/en-us/library/windows/desktop/ms682516%28v=vs.85%29.aspxWindows 开发中心:

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

我对这个错误的起源正确吗?我该如何克服这个问题?

Code:

我打了电话_beginthread with NULL as the ArgList并定义了ArgList在工作线程内部只是为了让线程工作。这是工作线程的代码:

注意:我在调试时注意到_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();
};

我如何从主线程调用它(在工作线程完成之前关闭):

handle=(HANDLE) _beginthread(py_embed,0,NULL);

注意:与此相关的问题 1 是here https://stackoverflow.com/questions/22413706/thread-running-the-second-time-gives-error


所以,我终于找到了问题所在。希望这可以帮助任何遇到与我相同问题的人

我仍然不完全理解这是如何工作的,但我基本上需要使用动态分配堆上的内存new在 C++ 中(和malloc在c)中。有关此的更多信息here http://www.learncpp.com/cpp-tutorial/79-the-stack-and-the-heap/

就我而言,我需要做这样的事情:

#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);

我仍然需要更好地理解这一点,并学习如何在最后取消分配delete但我的方式是正确的。

注意:我仍然需要帮助问题1 https://stackoverflow.com/questions/22413706/thread-running-the-second-time-gives-error与此相关,所以请看一下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在工作线程中使用关闭句柄 的相关文章

  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • ExpectedFailure 被计为错误而不是通过

    我在用着expectedFailure因为有一个我想记录的错误 我现在无法修复 但想将来再回来解决 我的理解expectedFailure是它会将测试计为通过 但在摘要中表示预期失败的数量为 x 类似于它如何处理跳过的 tets 但是 当我
  • Python:尝试检查有效的电话号码

    我正在尝试编写一个接受以下格式的电话号码的程序XXX XXX XXXX并将条目中的任何字母翻译为其相应的数字 现在我有了这个 如果启动不正确 它将允许您重新输入正确的数字 然后它会翻译输入的原始数字 我该如何解决 def main phon
  • 循环中断打破tqdm

    下面的简单代码使用tqdm https github com tqdm tqdm在循环迭代时显示进度条 import tqdm for f in tqdm tqdm range 100000000 if f gt 100000000 4 b
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 如何在 Django 中使用并发进程记录到单个文件而不使用独占锁

    给定一个在多个服务器上同时执行的 Django 应用程序 该应用程序如何记录到单个共享日志文件 在网络共享中 而不保持该文件以独占模式永久打开 当您想要利用日志流时 这种情况适用于 Windows Azure 网站上托管的 Django 应
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 检查所有值是否作为字典中的键存在

    我有一个值列表和一本字典 我想确保列表中的每个值都作为字典中的键存在 目前我正在使用两组来确定字典中是否存在任何值 unmapped set foo set bar keys 有没有更Pythonic的方法来测试这个 感觉有点像黑客 您的方
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 在 Pandas DataFrame Python 中添加新列[重复]

    这个问题在这里已经有答案了 例如 我在 Pandas 中有数据框 Col1 Col2 A 1 B 2 C 3 现在 如果我想再添加一个名为 Col3 的列 并且该值基于 Col2 式中 如果Col2 gt 1 则Col3为0 否则为1 所以
  • 对输入求 Keras 模型的导数返回全零

    所以我有一个 Keras 模型 我想将模型的梯度应用于其输入 这就是我所做的 import tensorflow as tf from keras models import Sequential from keras layers imp
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 循环标记时出现“ValueError:无法识别的标记样式 -d”

    我正在尝试编码pyplot允许不同标记样式的绘图 这些图是循环生成的 标记是从列表中选取的 为了演示目的 我还提供了一个颜色列表 版本是Python 2 7 9 IPython 3 0 0 matplotlib 1 4 3 这是一个简单的代
  • Python:元类属性有时会覆盖类属性?

    下面代码的结果让我感到困惑 class MyClass type property def a self return 1 class MyObject object metaclass MyClass a 2 print MyObject
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • PyDev 无法在 Eclipse 中工作

    我最近不得不重置我的 PC 重新启动 Eclipse 后出现此错误 id org python pydev editor PythonEditor 没有编辑器描述符 我尝试寻找解决方案 但其他人喜欢here https stackoverf
  • 创建新的 Google 日历

    我想使用 Android 应用程序在现有帐户上创建新的 Google 日历 例如this http sourceforge net projects lngooglecalsync Windows 应用程序确实如此 该应用程序使用 Gdat
  • 如何更改 :focus 上文本区域的边框颜色

    我想改变焦点上 TEXTAREA 的边框颜色 但我的代码似乎无法正常工作 代码已开启fiddle http fiddle jshell net ffS4S
  • PHP cURL、POST JSON

    我需要发布以下 JSON 代码 但由于某种原因它不起作用 下面是我的代码 fieldString 395609399 the curl request processor function processCurlJsonrequest UR
  • 在并行任务期间跟踪失效的 WebDriver 实例

    我看到一些使用 Selenium WebDriver 运行并行嵌套循环 Web 压力测试的死实例怪异现象 简单的例子是 比如说 点击 300 个独特的页面 每个页面有 100 次展示 我 成功 获得 4 8 个 WebDriver 实例Th
  • 如何在 YouTube 缩略图上叠加播放按钮

    在我正在进行的一个项目中 我们将媒体团队发布的大量 YouTube 视频提取到数据库中 以便我们可以将它们呈现为相关内容 我们希望能够在生成的 YouTube 缩略图上叠加一个播放按钮 以便更明显地表明缩略图代表的是可以播放的视频 我正在寻
  • 有没有办法在Linux平台上编译微软风格的内联汇编代码?

    正如标题中提到的 我想知道有没有办法在 Linux 操作系统 例如 ubuntu 中编译微软风格的内联汇编代码 如下所示 asm mov edi A EMMS 示例代码是内联汇编代码的一部分 可以在win10上使用cl exe编译器成功编译
  • 如何在 Android 中将提示文本置于 EditText 中?

    我需要将提示文本居中EditText在安卓中 我该怎么做呢 为了使提示文本居中以与 EditText 一起使用 您必须确保定义 android ellipsize start 我不知道为什么这会起作用 但确实如此 从个人代码中提取的示例
  • SQL 多重外连接(将 t-sql 连接转换为 ANSI 格式)

    我有 3 个表 t1 t2 t3 我想要一个基于以下条件的结果集 t1 在 t2 t1 的所有行 上有外连接 t1 在 t3 t1 的所有行 上有外连接 t2 在 t3 t2 的所有行 上有外连接 如何在单个查询中使用这些外部 3 个联接
  • 如何按顺时针/逆时针方向对所有多边形点进行排序?

    我一直在阅读贾维斯的算法 虽然它能够按顺时针方向对所有 外部点 进行排序 但内部点将被忽略 如下所示 有谁知道我是否必须实现任何其他算法或任何其他方法来按顺时针方向对每个点进行排序 谢谢 第一步格雷厄姆扫描 https en wikiped
  • 如何允许用户在 Web 应用程序中编辑附件?

    我们使用 ASP NET 创建了一个 Web 应用程序 允许用户上传文档并将其附加到业务实体 如客户 联系人等 该应用程序在内联网上运行 所有文件都通过 Web 应用程序上传到服务器上的共享文件夹中 我希望用户可以直接从网页上open实际文
  • 并行运行 junit 测试时的竞争条件

    我想知道如果我并行运行测试并且两个测试 如下 共享一个实例变量 是否会有一些竞争条件 所以我的测试类使用 SpringJunit4ClassRunner 运行 并且我有 2 个测试方法 a 和 b 变量state将从每个测试中修改或重新分配
  • 如何使用 ”!”作为注释指示符,还可以在语言语法高亮中使用 NOT 运算符吗?

    我正在使用 VScode 并创建自己的语言扩展来突出显示语法 其中我需要使用正则表达式来查找注释 基本规则是之后的一切 是一个注释 但是有一个特殊情况 什么时候 在里面eval 命令 它的意思是NOT 例如 我的一些代码如下所示 if co
  • PySpark DataFrame 列参考:df.col 与 df['col'] 与 F.col('col')?

    我有一个概念希望你能帮忙澄清 以下三种引用 PySpark 数据框中列的方式有什么区别 我知道不同的情况需要不同的形式 但不知道为什么 df col e g F count df col df col e g df col 0 F col
  • C# 语法中的问号[重复]

    这个问题在这里已经有答案了 可能的重复 使用条件 三元 运算符的好处 https stackoverflow com questions 3312786 benefits of using the conditional ternary o
  • numpy 矩阵代数最佳实践

    我的问题是关于下面最后一行 mu sigma mu 为什么它有效 一维 ndarray 被视为行向量还是列向量 不管怎样 不应该是这样吗mu T sigma mu or mu email protected cdn cgi l email
  • 使用requirejs优化和加载外部依赖

    我有一个需要 Facebook SDK 的模块 我想知道应该如何配置 SDK 的加载 以便 RequireJS 优化器正确处理它 In app require config paths facebook connect facebook n
  • 在每个url末尾添加斜杠(需要重写nginx规则)

    我尝试得到一个 到每个网址结尾 example com art should example com art I use nginx作为网络服务器 我需要为此重写规则 为了更好地理解 请检查以下内容 http 3much schnicksc
  • 将 WPF 中的图像源绑定到 URL

    我一直在浏览不同的帖子 试图找出我的问题出了什么问题 基本上我的用户控件上有一个 Image 标签 以及我想绑定到 url 的 Source 然而这不起作用 我尝试过使用返回的 ValueConverterBitmapImage new U
  • 如何在工作线程中使用关闭句柄

    我正在 Windows 中使用线程将 C 制作的插件连接到 python 脚本 该线程在会话期间将被多次调用 问题 如果我通过了ArgList in the beginthread错误 xxx exe 中 0x1E114A68 python