类内使用CreateThread的问题

cutrain2009 2010-01-13 12:24:54
我想在类内调用一个函数,该函数单独使用一个线程类处理;但发现无法使用类内的函数,不知道大家都是怎么处理的。本人很想让这个线程和其他函数处理一样,保留类的封装性质,只能访问该对象的数据结构;

另个问题是我使用了一个静态的变量和函数,一个MyThread中创建一个线程处理,处理函数是前面的静态函数

// MyThread.h: interface for the MyThread class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_MYTHREAD_H__F33A4E09_FE1A_4D17_AE1D_C50F38C008F6__INCLUDED_)
#define AFX_MYTHREAD_H__F33A4E09_FE1A_4D17_AE1D_C50F38C008F6__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "Windows.h"
#include<iostream>
using namespace std;

static int i;

static DWORD WINAPI func(LPVOID mParam)
{
i=0;
while(true)
{
Sleep(1000);
//cout<<i<<endl;
i++;
}
return 0;
}

class MyThread
{
public:
bool BeginThread();
MyThread();
virtual ~MyThread();

private:
PROCESS_INFORMATION pi;
};

#endif // !defined(AFX_MYTHREAD_H__F33A4E09_FE1A_4D17_AE1D_C50F38C008F6__INCLUDED_)

// MyThread.cpp: implementation of the MyThread class.
//
//////////////////////////////////////////////////////////////////////

#include "MyThread.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

MyThread::MyThread()
{

}

MyThread::~MyThread()
{

}

bool MyThread::BeginThread()
{
unsigned long temp;
pi.hThread = CreateThread(NULL,0,func,NULL,0,&temp);
return true;
}

主函数
#include "MyThread.h"

int main()
{
MyThread m_Thread;
m_Thread.BeginThread();
while(true)
{
Sleep(1000);
cout<<i<<endl;
}
return 0;
}

但发现变量i显示的不正常,都是0;
如果直接在线程中显示是正常的;

请大家帮帮忙
...全文
436 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
cutrain2009 2010-01-13
  • 打赏
  • 举报
回复
如果我在主,从线程中同时都显示i的值的话,就发现两个线程都在运行,只是从线程值在变,主线程不变
cutrain2009 2010-01-13
  • 打赏
  • 举报
回复
主,从线程是并行运行的,即使是主的死循环,从线程仍在运行的
cutrain2009 2010-01-13
  • 打赏
  • 举报
回复
使用volatile 结果是一样的,没有作用。
至于传递对象指针的,参数是在CreatThread函数中传递的,处理函数LPVOID mParam中取,但具体的实现不大清楚
jc_ontheroad 2010-01-13
  • 打赏
  • 举报
回复
[Quote=引用楼主 cutrain2009 的回复:]
但发现变量i显示的不正常,都是0;
如果直接在线程中显示是正常的;

请大家帮帮忙

[/Quote]

i 始终是0,应该是由于主线程抢占了CPU 资源,使得子线程无法运行。

另外,楼主的程序应该是个死循环吧,没有看到什么条件下程序能结束呢?
traceless 2010-01-13
  • 打赏
  • 举报
回复
2、>
volatile static int i;   

traceless 2010-01-13
  • 打赏
  • 举报
回复
1、
我想在类内调用一个函数,该函数单独使用一个线程类处理;但发现无法使用类内的函数,不知道大家都是怎么处理的。
===============
全是自己写的代码,可以传this指针;
或者 用友元函数封装类函数,传友元函数地址
cutrain2009 2010-01-13
  • 打赏
  • 举报
回复
用大家的建议,我将处理函数定义为类的友元函数,这样整个类都封装了,只有一个处理函数有那么点别扭;
请问大家,这样处理有哪些不妥吗,
会出问题吗,比如我多次调用处理函数,也就是多个从线程运行,
或是MyThread有多个运行实例对象的时候
cutrain2009 2010-01-13
  • 打赏
  • 举报
回复
恩,解决了,谢谢啦
Dolphin_001 2010-01-13
  • 打赏
  • 举报
回复
传this就行了
CreateThread(NULL,
0,
func,
this,
0,
&temp);
cutrain2009 2010-01-13
  • 打赏
  • 举报
回复
怎么将对象的指针传给处理函数,该处理函数单独使用一个线程,
traceless 2010-01-13
  • 打赏
  • 举报
回复
我就说怎么帖子回答了那么多。。。。
cutrain2009 2010-01-13
  • 打赏
  • 举报
回复
谢啦,这个已经解决了,
第一个问题请问如何解决,参数的问题
traceless 2010-01-13
  • 打赏
  • 举报
回复
Faint~

答得太快,没有看完题目

是的 我的第二个答案是错的
奔跑哥 2010-01-13
  • 打赏
  • 举报
回复
// MyThread.h: interface for the MyThread class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_MYTHREAD_H__F33A4E09_FE1A_4D17_AE1D_C50F38C008F6__INCLUDED_)
#define AFX_MYTHREAD_H__F33A4E09_FE1A_4D17_AE1D_C50F38C008F6__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "Windows.h"
#include <iostream>
using namespace std;

extern int i; //声明外部变量

static DWORD WINAPI func(LPVOID mParam)
{
i=0;
while(true)
{
Sleep(1000);
//cout < <i < <endl;
i++;
}
return 0;
}

class MyThread
{
public:
bool BeginThread();
MyThread();
virtual ~MyThread();

private:
PROCESS_INFORMATION pi;
};

#endif // !defined(AFX_MYTHREAD_H__F33A4E09_FE1A_4D17_AE1D_C50F38C008F6__INCLUDED_)

// MyThread.cpp: implementation of the MyThread class.
//
//////////////////////////////////////////////////////////////////////

#include "MyThread.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

MyThread::MyThread()
{

}

MyThread::~MyThread()
{

}

bool MyThread::BeginThread()
{
unsigned long temp;
pi.hThread = CreateThread(NULL,0,func,NULL,0,&temp);
return true;
}

主函数
#include "MyThread.h"
int i; //声明全局变量 i
int main()
{
MyThread m_Thread;
m_Thread.BeginThread();
while(true)
{
Sleep(1000);
cout < <i < <endl;
}
return 0;
}

改了i的声明,就可以了。
cutrain2009 2010-01-13
  • 打赏
  • 举报
回复
你这样处理的话,还是一个主线程在处理;
我试让func函数独占一个线程运行

类内接口
bool MyThread::BeginThread()
{
unsigned long temp;
pi.hThread = CreateThread(NULL,0,func,NULL,0,&temp);
return true;
}

来运行处理线程;这时候怎么给func函数传递this对象指针;

DWORD WINAPI func(LPVOID mParam) 处理函数的原型
其中mParam存的是运行参数的指针,现在该怎么处理;
和shell运行的程序一样,带有一些参数;
并且CreateThread中的第4个参数就是那个参数的指针
这是我的理解
jc_ontheroad 2010-01-13
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 cutrain2009 的回复:]
请问能不能具体点怎么传递类对象的指针给处理函数
[/Quote]

不太理解楼主的意思,就按我的理解这么做了:
比如:

void func(MyThread *myThread);

void main()
{
MyThread myThread;

func(&myThread);
}
cutrain2009 2010-01-13
  • 打赏
  • 举报
回复
请问能不能具体点怎么传递类对象的指针给处理函数
cutrain2009 2010-01-13
  • 打赏
  • 举报
回复
你的方法是到处变量i来使用;

我试着将处理函数和变量放在main.cpp文件中也是可以的,这样就可以解决变量的多次定义的;
但是感觉形式上有点乱;

你的方法很不错,谢啦
jc_ontheroad 2010-01-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 cutrain2009 的回复:]
确实和你描述的情况一样,请问该如何修改;
[/Quote]
MyThread.cpp 里:
int i;

MyThread.h 里:
extern int i;
cutrain2009 2010-01-13
  • 打赏
  • 举报
回复
不用静态变量的话,编译不过
加载更多回复(3)

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧