Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从调用堆栈获取函数指针_C++_Windows_Function Pointers - Fatal编程技术网

C++ 从调用堆栈获取函数指针

C++ 从调用堆栈获取函数指针,c++,windows,function-pointers,C++,Windows,Function Pointers,我想将多线程添加到一种不支持多线程或函数指针,但支持从.dll运行函数的语言(BlitzBasic) 该语言的编译器编译成某种形式的C,然后再编译成本机代码。这只是窗户 到目前为止,我的想法是在dll中创建一个函数,从BlitzBasic中调用该函数。此函数将检查调用堆栈以找出调用它的位置。然后它将分叉一条新的线程并返回。新线程将等待一小段时间(10毫秒左右),然后在BlitzBasic中调用函数的位置恢复执行。在BlitzBasic中,您必须基于该延迟控制其余的执行(因此第一个线程将退出该函数

我想将多线程添加到一种不支持多线程或函数指针,但支持从.dll运行函数的语言(BlitzBasic)

该语言的编译器编译成某种形式的C,然后再编译成本机代码。这只是窗户

到目前为止,我的想法是在dll中创建一个函数,从BlitzBasic中调用该函数。此函数将检查调用堆栈以找出调用它的位置。然后它将分叉一条新的线程并返回。新线程将等待一小段时间(10毫秒左右),然后在BlitzBasic中调用函数的位置恢复执行。在BlitzBasic中,您必须基于该延迟控制其余的执行(因此第一个线程将退出该函数,例如,设置一个变量,该变量将告诉第二个线程执行某些不同的函数)

我知道多线程会带来很多其他问题,但我会在到达那里时跨越这座桥

有没有办法在调用堆栈中找到函数的执行点?

这类似于


<>你必须小心这些,因为在退出过程中不会发生正常的清理。

在这个上下文中函数指针是不够的,因为函数指针只允许从其开始调用函数,但是你已经在函数的中间。

您可以使用/,但除非最初的语言设计时考虑到线程安全,否则您可能会遇到很多问题

特别是,如果您的语言具有任何全局状态,则必须在其周围创建锁


就我个人而言,我只会使用堆栈本身进行恢复,并让您的功能块直到它准备好返回。您仍然可以生成一个新线程。这会容易得多。您也可以从一个更简单的协作线程模型开始,而不是从抢占开始。这将让您看看它是否能工作。

您将继续必须使用汇编语言。你需要一个汇编语言函数,它可以遍历一个堆栈框架

通常帧指针寄存器指向当前堆栈帧。然后需要检查帧并找到保存的帧指针(例程调用方的帧指针)。帧指针通常指向返回时要执行的下一条指令的保存地址