除了定义全局变量,还有什么方法可以向工作者线程传递参数?

sintony 2000-02-17 12:33:00
定义全局变量
CClientInfo* pClientClose;

定义工作者线程
UINT ClientCloseProc(LPVOID pParam)
{
CClientInfo *m_pClient;
m_pClient = ::pClientClose; //②
}

在主线程中:
::pClientClose = pClient; //①
AfxBeginThread(ClientCloseProc, GetSafeHwnd(), THREAD_PRIORITY_HIGHEST);

Debug显示
程序运行到①时 pClientClose被正常赋值
但程序运行到②时 pClientClose值为空
如何解释,如何解决?
谢谢!
...全文
263 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
forgettor 2000-02-23
  • 打赏
  • 举报
回复
pClientClose在此线程运行时应一直存在,否则很容易出现上述问题!
forgettor 2000-02-23
  • 打赏
  • 举报
回复
pClientClose在此线程运行时一直存在!
sintony 2000-02-23
  • 打赏
  • 举报
回复
难道没人给我更好的答案吗?
dengdun 2000-02-18
  • 打赏
  • 举报
回复
工作线程的参数不仅可以是一个变量,还可以是一个结构指针,这个结构里可以保存很多东西,比如主线程的窗口句柄、需要在工作线程中要用到的参数等。比如:
struct param
{
HWND hWnd;
CString szMsg;
};
param m_param;
m_param.hWnd = this->GetSafeHwnd();
m_param.szMsg = "Hello";
AfxBeginThread(ClientCloseProc,(LPVOID)&m_param,THREAD_PRIORITY_HIGHEST);

UINT ClientCloseProc(LPVOID pParam)
{
param *const m_pClient = static_cast<param *>(pParam);
HWND hMainWnd = m_pClient->hWnd;
CString szMsg1 = m_pClient->szMsg;
::PostMessage(hMainWnd,...);
}
sintony 2000-02-17
  • 打赏
  • 举报
回复
因为工作者线程必须PostMessage以和主线程交换数据,所以第二个参数需是GetSafeHwnd(),有其它方法吗?
Idle 2000-02-17
  • 打赏
  • 举报
回复
AfxBeginThread(AFX_THREADPROC pfnThreadProc, LPVOID pParam, ...)的参数pParam可以指向一块Buffer,利用Buffer传递参数。需要注意的是,Buffer要从堆中申请,而不能利用栈空间(即用HeapAlloc()或malloc()申请,不能用局部变量),因为当超出local-variable的生命周期时,会进行出栈操作,从而invalidate the buffer .也许你原来的问题在这儿。
dengdun 2000-02-17
  • 打赏
  • 举报
回复
主线程中:
AfxBeginThread(ClientCloseProc,(LPVOID)&pClientClose);
工人线程中:
CClientInfo *const m_pClient = static_cast<CClientInfo *>(pParam);

需要注意的是:
工人线程必须是外部公共函数或类的静态成员函数。
repus 2000-02-17
  • 打赏
  • 举报
回复
ClientCloseProc(LPVOID pParam)
的那个pParam就是传递参数用的嘛。
它可以指向复杂数据类型的。

15,471

社区成员

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

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