`
huobengle
  • 浏览: 862088 次
文章分类
社区版块
存档分类
最新评论

成员函数做为线程函数

 
阅读更多

WIN32线程控制主要实现线程的创建、终止、挂起和恢复等操作,这些操作都依赖于WIN32提供的一组API和具体编译器的C运行时库函数。

1.线程函数
  在启动一个线程之前,必须为线程编写一个全局的线程函数,这个线程函数接受一个32位的LPVOID作为参数,返回一个UINT,线程函数的结构为:


在线程处理代码部分通常包括一个死循环,该循环中先等待某事情的发生,再处理相关的工作:


一般来说,C++的类成员函数不能作为线程函数。这是因为在类中定义的成员函数,编译器会给其加上this指针。请看下列程序:

程序编译时出现如下错误:
error C2664: '_beginthread' : cannot convert parameter 1 from 'void (void *)' to 'void (__cdecl *)(void *)'
None of the functions with this name in scope match the target type
再看下列程序:


程序编译时会出错:
error C2664: '_beginthread' : cannot convert parameter 1 from 'void (void *)' to 'void (__cdecl *)(void *)'
None of the functions with this name in scope match the target type

  如果一定要以类成员函数作为线程函数,通常有如下解决方案:

  (1)将该成员函数声明为static类型,去掉this指针;
  我们将上述二个程序改变为:


均编译通过。

  将成员函数声明为静态虽然可以解决作为线程函数的问题,但是它带来了新的问题,那就是static成员函数只能访问static成员。解决此问题的一种途径是可以在调用类静态成员函数(线程函数)时将this指针作为参数传入,并在改线程函数中用强制类型转换将this转换成指向该类的指针,通过该指针访问非静态成员。

  (2)不定义类成员函数为线程函数,而将线程函数定义为类的友元函数。
这样,线程函数也可以有类成员函数同等的权限;

  我们将程序修改为:


(3)可以对非静态成员函数实现回调,并访问非静态成员,此法涉及到一些高级技巧,在此不再详述。

分享到:
评论

相关推荐

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

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

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

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

    在多线程应用中,每个线程都通过指向成员函数的指针来调用该函数。在这样的应用中,如果不用成员指针,编程是非常困难的。 刚遇到这种语法时也许会让你止步不前。但你会发现,使用恰当的类型定义之后,复杂的语法是...

    python 对类的成员函数开启线程的方法

    今天小编就为大家分享一篇python 对类的成员函数开启线程的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

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

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

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

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

    BCB线程中调用主界面的回调函数

    网上的回调函数都是API例子,学习函数指针倒是不错,可是很难让初学者立即应用。常见的情况是辅线程完成某事件后需要“通知”主界面,比如常见的进度条——线程中完成一定的进度后即通知主界面显示到一定的刻度。本...

    Python开启线程,在函数中开线程的实例

    这里只是简单的一个demo,主要是开线程的处理方式,在自己类里面的函数中开启线程,并用自己类的成员函数做线程运行函数。 #coding=utf-8 import threading class Test: __init = 1 def __init__(self): self._...

    C++线程池/线程工具

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

    VC多线程编程(vs2010Unicode修改版)

    如果WriteW函数是类的成员函数,“CWinThread *pWriteW=AfxBeginThread(WriteW,……”中的线程调用函数前加上“::”,修改后“CWinThread *pWriteW=AfxBeginThread(::WriteW,……”,如果WriteW成员函数有static修饰...

    MFC多线程编程实例

    这是一个使用VC++编写的一个MFC多线程的源程序,程序中线程执行函数有两种,一种是从CWinThread继承的对象的RUNTIME_CLASS,用于线程启动对话框,另一种是类的成员函数作为线程的执行函数。另外本程序还修改了MFC...

    createthread函数用法详解

    详细介绍了createthread函数 在程序中的运用 对于c++多线程的学习有很大帮助

    Delphi多线程教程

    Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对TThread类的几个成员作一简单介绍,再说明一下Execute的...程函数的入口,直至线程函数结束,线程也就结束了。

    CreateThread创建多线程与单线程比较

    对于_beginthread()创建的线程,其线程函数定义为: void ThreadPro(void * pArguments ); _beginthreadex()为_beginthread()的升级版。 总结:AfxBeginThread是MFC的全局函数,是对CreateThread的封装。 ...

    详解C++ thread用法总结

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

Global site tag (gtag.js) - Google Analytics