d传递地址时得到闭包
public:
void server_init() {
CreateThread(NULL, 0, &this.ClientThread, cast(PVOID)clientSocket, 0, NULL);
}
private:
extern(Windows)
DWORD ClientThread(PVOID param) {
this.log("你好");
return 0;
}
CreateThread
调用私
函数地址.得到:
不能传递extern (Windows) uint delegate(void* param)
到extern (Windows) uint function(void*) @system参数
非静态
成员函数指针总是产生闭包
.否则,访问无法类实例的成员
.参考
可结合类对象
与其他
参数,线程函数
知道如何解开类对象
来调用成员函数
:
import std.stdio;
// 这是库
alias MyThreadFunc = uint function(void*);
// 库提供:
extern (C)
void libraryCreateThread(MyThreadFunc func, void* param) {
writeln("函数");
func(param);
}
// 我的类
class C {
string s;
// 要调用的函数
void myClientThread(void* param) {
writeln("想要成员函数");
writeln("成员:", s);
// 额外参数为`整`.
auto arg = *cast(int*)param;
writeln("额外参:", arg);
}
}
// 库要的函数.
uint myNonMemberThreadFunc(void* param) {
writeln("使用参数");
auto args = *cast(MyThreadArgs*)param;
writeln("调用成员函数");
args.c.myClientThread(args.extraArg);
return 0;
}
// 组合(这里是指针)实例与其他参数
struct MyThreadArgs {
C c;
void* extraArg;
}
void main() {
auto c = new C();
c.s = "类成员";
// 其他参数
int mainArg = 42;
// 组合类对象,必须在堆上
auto args = MyThreadArgs(c, &mainArg);
// 调用库.
libraryCreateThread(&myNonMemberThreadFunc, cast(void*)&args);
}
刚刚按参数
传递类对象,现在得到了"环境
".
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现