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

刚刚按参数传递类对象,现在得到了"环境".

posted @   zjh6  阅读(11)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示