[初级线程问题]辅助线程声明的时候必须要static吗?

NoZ 2004-06-28 03:24:05
MSDN中 没有找到相关说明, 在用CreateThread或者AfxBeginThread创建辅助线程的时候, 如果不把线程开始函数声明成static的就编译不过去

但是如果是static的话就无法访问类实例的方法和成员变量了,相关的方法和成员函数全部再要声明为static? 这样就不能用实例的成员了...


比如最简单的一个例子,一个对话框程序,里面两个 EditBox, 两个按钮, 按钮1点了之后创建一个线程使EditBox1每隔1秒输出一个时间,按钮2点了之后创建一个线程使EditBox2每隔2秒输出一个时间,如何实现?


...全文
171 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
polarman 2004-06-28
  • 打赏
  • 举报
回复
线程函数必须为静态类成员,或者全局函数
可以通过传送一个对象指针或对象引用作为线程函数的参数来访问对象成员
Wenxy1 2004-06-28
  • 打赏
  • 举报
回复
创建 Worker 线程,线程函数可以为静态类成员,或者全局函数。
例如:

class
{
//...
static UINT ThreadFun()
{
//...
}
};

UINT OtherThreadFun()
{
//...
}

线程体是回调函数。
shootingstars 2004-06-28
  • 打赏
  • 举报
回复
线程函数申明的原形是
DWORD WINAPI ThreadProc(
LPVOID lpParameter
);
所以,如果你把你的线程函数申明为
DWORD WINAPI MyThreadProc(LPVOID lpp)
{
Todo....
}
这没有任何问题。(不需要static修饰)

但是如果你想在类中申明你的线程函数
class CMyclass
{
public:
DWORD WINAPI MyThreadProc(LPVOID lpp);
void Run();
private:
int ival;
}

CMyclass::Run()
{
CreateThread(MyThreadProc);
}
这样会导致编译出错。为什么呢?因为,你的线程函数的申明不对。
为什么不对呢?不是申明成
DWORD WINAPI MyThreadProc(LPVOID lpp);了吗?呵呵,虽然样子看着没有变化,当时编译器在编译类中的函数时会自动加上this指针,所以实际的样子是:
DWORD WINAPI MyThreadProc(LPVOID lpp, CMyclass *this);
那么这个线程函数当然就不对了。

所以,如果一定想在类中定义线程函数,就必须加上static修饰
static DWORD WINAPI MyThreadProc(LPVOID lpp);
这样编译器就不会自动加上this指针了。


呵呵,问题又来了,加上this指针就不能访问类的实例的变量了,怎么办呢?
我们可以充分利用线程函数的参数,如果把这个实例的this指针传递进去,不是就可以访问了么?
所以,这样调用
CMyclass::Run()
{
CreateThread(MyThreadProc, this);
}

在线程函数中这样处理:
static DWORD WINAPI MyThreadProc(LPVOID lpp)
{
CMyclass *_this = lpp;
_this->val = 1234; //这样访问类实例的变量。
}
Phourm 2004-06-28
  • 打赏
  • 举报
回复
CreateThread或者AfxBeginThread都有一个LPVOID lpData的参数,这就是给你用来调用类成员的一个接口

CXXXEdit
CreateThread(...XXX,this...)

...
static WINAPI CXXXEdit::XXX(LPVOID lpData)
{
CXXXEdit* pThis = (CXXXEdit*)lpData;
pThis->成员...
...
}
lianglp 2004-06-28
  • 打赏
  • 举报
回复
/////////////////////////////
//输出线程
UINT OutTextThread(LPARAM lParam)
{
HWND hwnd = (HWND)lParam ;
int nCounter ;
CString strText ;
do
{
strText.Format("%d",nCounter++) ;
CWnd* pEditCtl = CWnd::FromHandle(hwnd) ;
pEditCtl->SetWindowText(strText) ;
}while(TRUE) ;
return NULL ;
}

//////////////////////////////
//按扭1单击事件
CMyDialog::OnClicked()
{
AfxBeginthread(OutTextThread,m_editCtl1.m_hWnd) ;//传递编辑框1的窗口句柄
}

/////////////////////////////
//按钮2单击事件同上

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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