`
kakueiken
  • 浏览: 17993 次
  • 性别: 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++非静态成员函数完全可以作为线程函数

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

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

    自己总结的如何在多线程中调用c++成员函数和使用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++ 中线程安全的对象回调

    如何保证即将析构对象 x 的时候,不会有另一个线程正在调用 x 的成员函数?或者说,如何保证在执行 x 的成员函数期间,对象 x 不会在另一个线程被析构?如何避免这种竞态条件是 C++ 多线程编程面临的基本问题,可以...

    C++11多线程编程.zip

    C++11多线程编程future其他成员函数、shared_future、atomic C++11多线程编程std__atomic续谈、std__async深入谈 C++11多线程编程windows临界区、其他各种mutex互斥量 C++11多线程编程补充知识、线程池浅谈、数量谈...

    c++11线程与线程池Demo 完整vs2013工程

    利用c++11标准库实现的线程和线程池样例程序,可调用任意参数的函数作为线程任务,支持类成员函数的调用。

    C++线程池/线程工具

    1:可以使用类成员函数/全局函数单独的创建一个线程。 2:可以使用类成员函数/全局函数单独的为线程池添加一个任务,可以带多个参数。 3:线程池的线程数量可手动扩展,稍作修改可以修改为自动扩充。 是否下载可前往...

    当析构函数遇到多线程── C++ 中线程安全的对象回调 PDF

    如何保证即将析构对象 x 的时候,不会有另一个线程正在调用 x 的成员函数?或者说,如何保证在执行 x 的成员函数期间,对象 x 不会在另一个线程被析构?如何避免这种竞态条件是 C++ 多线程编程面临的基本问题,可以...

    《当析构函数遇到多线程》PPT

    如何保证即将析构对象 x 的时候,不会有另一个线程正在调用 x 的成员函数?或者说,如何保证在执行 x 的成员函数期间,对象 x 不会在另一个线程被析构?如何避免这种 race condition 是 C++ 多线程编程面临的基本...

    C++11/14 线程调用类对象和线程传参的方法

    主要介绍了C++11/14 线程调用类对象和线程传参的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    详解C++ thread用法总结

    std::thread类成员函数: (1)、get_id:获取线程ID,返回一个类型为std::thread::id的对象。 (2)、joinable:检查线程是否可被join。检查thread对象是否标识一个活动(active)的可行性线程。缺省构造的thread对象、...

    C++多线程获取返回值方法详解

    主要介绍了C++多线程获取返回值方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    线程委托库C++源码(内置多线程浏览器实现)

    线程委托的概念主要是在任意线程中委托其他线程执行代码,例如调用一个API函数,或者调用一个对象的成员函数。 源码使用了C++模板库,内部采用ATL实现。使用时只需关注压缩文件中的Raptor.h文件,这是封装好的类,...

    sensorPluginTest0916.zip

    本程序是在ubuntu20.04下基于class_loader开发的一个插件,里面使用了基类、子类,在测试程序中,将子类对象赋给父类指针,然后使用父类的成员函数作为线程函数启动线程。并可以从外部传入参数到线程函数中。最后还...

    C++面试题,针对资深开发工程师面试题目含详细解答

    7 C++ 的一个类中,静态成员函数和普通成员函数有什么区别? 8 简述指针常量与常量指针区别 9 如何避免“野指针” 10 C++ 仿函数是干什么用的? 11 什么时候使用虚析构函数? 为什么? 12 为什么将 0.1f 更改为 0 ...

    Visual C++开发经验技巧宝典(第1章)

    0070 如何用非静态的类成员函数作为线程函数 29 0071 如何在常量函数中修改数据成员 30 1.9 STL模板库 30 0072 为什么在程序中广泛使用STL 30 0073 如何在STL中使用容器 30 0074 STL算法的优点 31 0075...

    Boost C++扩展库

    Boost库是一个经过千锤百炼、可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一。 Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容。 Boost中比较有...

    C++中多线程与Singleton的那些事儿

     看到这个题目后,第一个想法是用Scott Meyer在《Effective C++》中提到的,在static成员函数中构造local static变量的方法来实现,但是经过一番查找、思考,才明白这种实现在某些情况下是有问题的。本文主要将从...

Global site tag (gtag.js) - Google Analytics