`
kakueiken
  • 浏览: 18402 次
  • 性别: Icon_minigender_1
  • 来自: 无线
最近访客 更多访客>>
社区版块
存档分类
最新评论

C++成员函数作为 线程函数

 
阅读更多
一般来说,用静态函数是可以了.
但是尝试下用成员函数.呵呵.

h文件
// CclientDlg 对话框
class CclientDlg : public CDialog
{
public:
    void testproc(void *);
    unsigned int __stdcall testproc1(void *);
public:
    static void myproc(void *);
};


cpp文件
//_beginthread 用,符合__cdecl call
union {
    void ( *ThreadProc)(void *);
    void ( CclientDlg::*MemberProc)(void *);
} Proc;

//_beginthreadex 用,符合__stdcall  call
union {
    unsigned int ( __stdcall *ThreadProc)(void *);
    unsigned int ( __stdcall CclientDlg::*MemberProc)(void *);
} Proc1;

//开始按钮
void CclientDlg::OnBnClickedCnn()
{
    // TODO: 在此添加控件通知处理程序代码
    myclient = socket(AF_INET,SOCK_STREAM,0/*IPPROTO_TCP*/);
    if(INVALID_SOCKET  == myclient){
        MessageBox(L"init errr");
    }
    struct sockaddr_in serv_addr;
    serv_addr.sin_family=AF_INET;
    serv_addr.sin_port=htons(5000);
    serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //inet_addr转换为网络字节序
    if(connect(myclient,( struct sockaddr *)&serv_addr,sizeof(struct sockaddr))!=0){
        int e = WSAGetLastError();
        MessageBox(L"connect errr");
    }
    _beginthread( CclientDlg::myproc, 0, NULL );

    Proc.MemberProc = &CclientDlg::testproc;
    //调用的时候,必须传this指针.对于类成员,其实隐藏第一个参数就是this指针.
    _beginthread(Proc.ThreadProc, 0, this);
    
    Proc1.MemberProc = &CclientDlg::testproc1;
    _beginthreadex(0,0,Proc1.ThreadProc,this,0,0);

    //函数也是一个地址罢了,虽然有些时候编译器不能转换,但是本质是不变的,只是一个int值,其实用汇编更容易实现.上面的union就是为了解决编译器编译出错的.
}

//成员 线程函数
unsigned int __stdcall CclientDlg::testproc1(void *){
    return 0;
}
void CclientDlg::testproc(void *){
}



分享到:
评论

相关推荐

    c++成员函数成为线程函数

    一、C++成员函数成为线程函数 1.1 为什么要在线程中调用成员函数 在多线程应用中,通常需要在线程中执行特定任务,这些任务可能涉及类的私有或保护成员,因此需要在成员函数中处理。通过使成员函数成为线程函数,...

    C++非静态成员函数完全可以作为线程函数

    一般地,线程要读写类的私有成员变量,只有两种方法:将全局函数声明为类友元friend,或者使用静态的成员函数static。...本例就是自己的研究成果,使用非静态的成员函数作为线程函数,还能修改类的非静态的数据成员。

    c++类成员函数作为回调函数

    总结来说,C++中将类成员函数作为回调函数涉及到了多种技术,包括使用静态成员函数、`std::function`、`std::bind`、`std::mem_fn`、`std::shared_ptr`以及回调对象等。理解并熟练掌握这些方法,能够帮助开发者在...

    C++ 线程函数是类的成员函数

    3. **线程函数作为成员函数**:将线程函数定义为类的成员,可以方便地访问类的私有数据,无需通过额外的同步机制(如锁)来保护数据,因为线程函数和数据在同一作用域内,天然具备了访问权限。 二、创建线程成员...

    C++将类的成员函数作为回调函数

    ### C++将类的成员函数作为回调函数 #### 背景与问题 在C++编程中,回调函数是一种常见的设计模式,它允许程序在特定的事件或条件下调用一个预先注册的函数。然而,当涉及到类的成员函数时,事情变得稍微复杂了...

    类成员函数创建线程源码

    通过以上步骤,我们可以成功地在C++类的成员函数中创建线程。这种方式不仅方便了代码的组织,也便于管理和控制线程的生命周期。在实际开发中,类内线程常用于实现复杂的并发任务,如定时任务、网络通信、数据处理等...

    C++线程的高级封装, 支持对类成员函数开启线程

    示例: Thread t1; t1.Start(ThreadStart(&ThreadFunction, (void*)1)); t1.Join();... // 类, ThreadMethod为非静态成员 Thread t2; t2.Start(ThreadStart(&test, &Test::ThreadMethod)); t2.Join();

    C回调C++成员函数,C++回调C函数~测试可用哦~

    在C++编程中,"C回调C++成员函数"是一个常见的需求,特别是在处理跨语言或跨库接口时。回调函数是一种机制,允许我们将一个函数的指针传递给其他代码,以便在特定事件发生时调用该函数。由于C++支持面向对象特性,而...

    APIHook、InlineHook库,使用C++11编写,可将回调函数绑定到类成员函数

    本库利用C++11的新特性,提供了一种优雅的方式来实现这些功能,并允许将回调函数直接绑定到类成员函数。 APIHook技术主要涉及到动态改变API调用的过程。它通常通过在调用API函数之前插入自定义代码来实现,使得原本...

    C++成员函数指针的应用

    总的来说,虽然C++成员函数指针的语法看起来复杂,但是通过理解和熟练使用,我们可以编写出更高效、更灵活的代码,特别是在需要动态绑定行为和处理多线程编程的场景下。成员函数指针是C++强大功能的一个体现,它为...

    用C++进行函数式编程

    - **std::function**:`std::function`是一个通用的目标类型,可以存储、复制函数对象,包括普通函数、成员函数、绑定表达式、lambda表达式等。这为在C++中实现更高层次的函数式编程概念(如高阶函数)提供了基础。 ...

    C++如何创建杀死线程

    在上述示例中,我们定义了一个简单的线程函数`threadFunction`,并通过`std::thread`构造函数创建了一个线程。调用`t.join()`确保主线程等待新创建的线程执行完毕后才继续执行。 ### 二、线程的终止 #### 2.1 使用...

    visual c++用类的方法作为线程的函数体.rar

    2. **全局或局部函数配合指针**:创建一个全局或局部函数作为线程函数,这个函数接受一个指向类对象的指针作为参数,然后调用该对象的方法。这样,我们可以在线程中间接调用类的方法。 3. **std::function和std::...

    C++11实现多线程电梯运行

    这个库提供了一种创建新线程的方法,使得函数或者成员函数可以在新的执行上下文中运行。例如,我们可以创建一个`std::thread`对象,并将电梯运行的逻辑作为参数传入,这样电梯运行的代码就在一个新的线程上执行了。 ...

    C++面向对象多线程编程

    《C++面向对象多线程编程》是一本深入探讨C++编程技术的书籍,尤其侧重于面向对象设计和多线程编程。对于任何希望提升C++技能,尤其是想要在现代软件开发环境中应用并发处理的开发者而言,这本书都是一份宝贵的学习...

    怎么实现类的成员函数作为回调函数

    总的来说,要在C++中使用类的成员函数作为回调,可以考虑使用友元函数、静态成员函数或者将调用回调的函数也设计为类的成员。选择哪种方法取决于具体的需求和场景,比如是否需要访问非静态成员、是否有多线程环境等...

    关于C++静态成员函数访问非静态成员变量的问题

    在这种情况下,可以使用上述方法将对象实例作为参数传递给静态线程函数。 总之,C++的静态成员函数不能直接访问非静态成员变量,因为它们没有`this`指针。要解决这个问题,可以将变量改为静态,或者通过传递对象...

    C++面向对象多线程编程.rar

    1. **类**:类是C++中定义对象模板或蓝图的构造,它包含了数据成员(变量)和成员函数(方法),描述了对象的属性和行为。 2. **对象**:对象是类的实例,它是程序中实际进行操作的基本单位。每个对象都有自己的...

Global site tag (gtag.js) - Google Analytics