一般来说,用静态函数是可以了.
但是尝试下用成员函数.呵呵.
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++成员函数成为线程函数 1.1 为什么要在线程中调用成员函数 在多线程应用中,通常需要在线程中执行特定任务,这些任务可能涉及类的私有或保护成员,因此需要在成员函数中处理。通过使成员函数成为线程函数,...
一般地,线程要读写类的私有成员变量,只有两种方法:将全局函数声明为类友元friend,或者使用静态的成员函数static。...本例就是自己的研究成果,使用非静态的成员函数作为线程函数,还能修改类的非静态的数据成员。
总结来说,C++中将类成员函数作为回调函数涉及到了多种技术,包括使用静态成员函数、`std::function`、`std::bind`、`std::mem_fn`、`std::shared_ptr`以及回调对象等。理解并熟练掌握这些方法,能够帮助开发者在...
3. **线程函数作为成员函数**:将线程函数定义为类的成员,可以方便地访问类的私有数据,无需通过额外的同步机制(如锁)来保护数据,因为线程函数和数据在同一作用域内,天然具备了访问权限。 二、创建线程成员...
### 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++11的新特性,提供了一种优雅的方式来实现这些功能,并允许将回调函数直接绑定到类成员函数。 APIHook技术主要涉及到动态改变API调用的过程。它通常通过在调用API函数之前插入自定义代码来实现,使得原本...
总的来说,虽然C++成员函数指针的语法看起来复杂,但是通过理解和熟练使用,我们可以编写出更高效、更灵活的代码,特别是在需要动态绑定行为和处理多线程编程的场景下。成员函数指针是C++强大功能的一个体现,它为...
- **std::function**:`std::function`是一个通用的目标类型,可以存储、复制函数对象,包括普通函数、成员函数、绑定表达式、lambda表达式等。这为在C++中实现更高层次的函数式编程概念(如高阶函数)提供了基础。 ...
在上述示例中,我们定义了一个简单的线程函数`threadFunction`,并通过`std::thread`构造函数创建了一个线程。调用`t.join()`确保主线程等待新创建的线程执行完毕后才继续执行。 ### 二、线程的终止 #### 2.1 使用...
2. **全局或局部函数配合指针**:创建一个全局或局部函数作为线程函数,这个函数接受一个指向类对象的指针作为参数,然后调用该对象的方法。这样,我们可以在线程中间接调用类的方法。 3. **std::function和std::...
这个库提供了一种创建新线程的方法,使得函数或者成员函数可以在新的执行上下文中运行。例如,我们可以创建一个`std::thread`对象,并将电梯运行的逻辑作为参数传入,这样电梯运行的代码就在一个新的线程上执行了。 ...
《C++面向对象多线程编程》是一本深入探讨C++编程技术的书籍,尤其侧重于面向对象设计和多线程编程。对于任何希望提升C++技能,尤其是想要在现代软件开发环境中应用并发处理的开发者而言,这本书都是一份宝贵的学习...
总的来说,要在C++中使用类的成员函数作为回调,可以考虑使用友元函数、静态成员函数或者将调用回调的函数也设计为类的成员。选择哪种方法取决于具体的需求和场景,比如是否需要访问非静态成员、是否有多线程环境等...
在这种情况下,可以使用上述方法将对象实例作为参数传递给静态线程函数。 总之,C++的静态成员函数不能直接访问非静态成员变量,因为它们没有`this`指针。要解决这个问题,可以将变量改为静态,或者通过传递对象...
1. **类**:类是C++中定义对象模板或蓝图的构造,它包含了数据成员(变量)和成员函数(方法),描述了对象的属性和行为。 2. **对象**:对象是类的实例,它是程序中实际进行操作的基本单位。每个对象都有自己的...