【问题标题】:Access object's function from separate thread从单独的线程访问对象的函数
【发布时间】:2016-08-24 12:48:09
【问题描述】:

我想说明在 C++ 中调用实例化类的函数时遇到的问题。

我正在使用单独的线程来监听 TCP 套接字,所以当数据到来时,我想调用一个函数来开始执行任务。我正在使用process.h 库和_beginthread(socket_init,0,NULL); 来启动带有socket_init() 函数的线程,这会启动监听器。

为了让您了解情况,就在线程初始化调用之前,我有这个:

CPhoneDlg dlg = new CPhoneDlg;
m_pMainWnd = &dlg;

这个类声明了这个函数:

CTapiLine* CPhoneDlg::GetActiveLine()   {...}

所以这一切的重点是能够从在单独线程中执行的函数中调用GetActiveLine()

为此,我尝试这样做:

CTapiLine* line = dlg.GetActiveLine();

但它就是不知道dlg是什么,当我尝试编译代码时显示“标识符未声明”。

有什么方法可以让dlg 对象可见,这样它的方法就可以被单独的线程“调用”了吗?

【问题讨论】:

标签: c++ multithreading function visual-c++ call


【解决方案1】:

前几天我不得不弄清楚这个确切的问题,所以我想我可以提供帮助。您需要将一个对象传递给您的类到线程函数中。见以下代码:

DWORD WINAPI PhoneThread(LPVOID lpParam)
{
    CPhoneDlg *phoneDlg = reinterpret_cast<CPhoneDlg *>(lpParam);
    CTapiLine* line = phoneDlg.GetActiveLine();
}

并像这样实例化线程(在您的班级中!):

CreateThread(NULL, 0, PhoneThread, this, 0, NULL);

只要GetActiveLine() 是公开的,你应该可以让它像这样工作。

我正在做的是将指向主类的指针作为 LPVOID 传递。进入线程后,可以使用reinterpret_cast 将其强制转换回主类的类型。现在,您在线程中有一个指向该类的指针,您可以访问公共函数和变量。

【讨论】:

  • 这听起来是个不错的方法。我将在星期一上班后立即尝试这个。遇到什么我都会回来的!感谢 C. Korb 的解释,非常清楚。
  • 抱歉,出于某种原因,我认为您使用的是 winapi,但您可能不是。有很多其他方法可以做你正在尝试的事情,但这是完成它的一种非常简单的方法。
  • 另一种方式(如果您愿意),您可以声明一个全局变量:CPhoneDlg *g_phonDlgPtr。在 CPhoneDlg 的构造函数中,设置 g_phoneDlgPtr = this,现在您可以在任何地方使用 g_phoneDlgPtr 来访问该类。然而,这是一个更强大且更危险的解决方案,所以如果它适合您,我会坚持使用上述解决方案。
  • 好吧,我将尝试解释我现在面临的问题。我通过为对话框创建一个全局指针解决了这个问题,然后从该指针中调用函数。当问题出现时,我可以调用一个方法(比如说,Set_EditBox),它应该在对话框的编辑框中写入一些内容,但从辅助线程调用它似乎实际上什么也没做。如果我尝试从辅助线程启动调用(对话框类上的 OnMakeCall 方法),它也会崩溃。我试图在主线程上设置障碍,但我不能让它保持冻结状态。
  • 你能分享更多的代码吗?没有它就很难理解问题。
猜你喜欢
  • 1970-01-01
  • 2012-04-25
  • 2011-01-27
  • 1970-01-01
  • 2019-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多