【问题标题】:Using & Creating threads in wxwdigets in c++ on windows在 windows 上 c++ 中的 wxwidgets 中使用和创建线程
【发布时间】:2012-04-13 05:11:10
【问题描述】:

我正在阅读与在 windows 上使用 c++ 中的 wxwidgets 进行线程创建相关的内容,但是我无法理解以下代码的 sn-p 含义:-

以下内容是项目的一部分:-

  Myfirm.cpp
  My thread.h
  Mythread.cpp

  in Myfirm.cpp

  the following code is not understood by me:-

  BEGIN_EVENT_TABLE(MyFrm,wxFrame)
       EVT_COMMAND(wxID_ANY, wxEVT_MYTHREAD, MyFrm::OnMyThread)
  END_EVENT_TABLE()

  void MyFrm::PerformCalculation(int someParameter){//not sure what is it 
   MyThread *thread = new Mythread(this, someParameter);
   thread->Create();
   thread->Run();
   }

  void MyFrm::OnMyThread(wxCommandEvent& event)//here also the clarity is not good
  {
   unsigned char* temp = (unsigned char*)event.GetClientData();

   delete[] temp;  
  }    

  in this exampe what is even more confusing is that , it does not contain a main()     
  function

  in Mythread.h

  BEGIN_DECLARE_EVENT_TYPES()
       DECLARE_EVENT_TYPE(wxEVT_MYTHREAD, -1)
  END_DECLARE_EVENT_TYPES()

  in Mythread.cpp

  DEFINE_EVENT_TYPE(wxEVT_MYTHREAD)
  MyThread::MyThread(wxEvtHandler* pParent, int param) : wxThread(wxTHREAD_DETACHED),                      
  m_pParent(pParent)

  {
   m_param = param;
  }
  void* MyThread::Entry()
  {
  wxCommandEvent evt(wxEVT_MYTHREAD, GetId());
  evt.SetInt(r); 
  evt.SetClientData(data); 
  wxPostEvent(m_pParent, evt);
  return 0;
  }
  i am atill wondering how does the following code works and have no idea about where 
  where the main function is?

谢谢

【问题讨论】:

  • 在 wxWidget 应用程序中,没有您自己编写的 main 函数,而是包装在一个特殊的 wxWidget 宏 IMPLEMENT_APP 中。还有什么不明白的? wxWidget 线程是如何工作的?形式?事件?你读过手册和教程吗?
  • 我以这个为例在我的 qwn 项目中使用它,我知道需要定义一个像#define IMPLEMENT_APP 这样的宏,但它在这里的相关性和使用我无法猜测,也建议在这里使用它。

标签: c++ multithreading wxwidgets mutex locks


【解决方案1】:

首先,我建议您查看 wxWidgets 安装中的线程示例和 wxThread 的文档页面,其中包含一个大示例。但是,让我分解您的代码并尝试解释一下。

BEGIN_EVENT_TABLE(MyFrm,wxFrame)
       EVT_COMMAND(wxID_ANY, wxEVT_MYTHREAD, MyFrm::OnMyThread)
END_EVENT_TABLE()

这是一个event table,它表示框架将处理具有任何ID 的wxEVT_MYTHREAD 类型的事件,当它收到一个时,它将调用MyFrm::OnMyThread 方法。

void MyFrm::PerformCalculation(int someParameter){//not sure what is it 
   MyThread *thread = new Mythread(this, someParameter);
   thread->Create();
   thread->Run();
}

这个方法创建了一个MyThread 的实例,传递给它一个整数参数,大概是为了做一些计算。然后它运行线程。

void MyFrm::OnMyThread(wxCommandEvent& event)//here also the clarity is not good
{
   unsigned char* temp = (unsigned char*)event.GetClientData();
   delete[] temp;  
} 

这是在触发wxEVT_MYTHREAD 事件时调用的方法。然后它从事件中获取数据(在我们的例子中是在线程中设置的)并且通常会用它做一些事情,在这种情况下它只是删除它。

在这个例子中更令人困惑的是,它不包含 main()
功能

我会看一下wxApp overview,它在 wxWidgets 中解释了这一点,以及仅显示 wxWidgets 程序基础知识的最小示例。

BEGIN_DECLARE_EVENT_TYPES()
       DECLARE_EVENT_TYPE(wxEVT_MYTHREAD, -1)
END_DECLARE_EVENT_TYPES()

这段代码声明了一个名为wxEVT_MYTHREAD的新事件类型。

DEFINE_EVENT_TYPE(wxEVT_MYTHREAD)

这定义了新的事件类型。

MyThread::MyThread(wxEvtHandler* pParent, int param) : wxThread(wxTHREAD_DETACHED), m_pParent(pParent)
{
    m_param = param;
}

存储参数的线程类的构造函数。

void* MyThread::Entry()
{
    wxCommandEvent evt(wxEVT_MYTHREAD, GetId());
    evt.SetInt(r); 
    evt.SetClientData(data); 
    wxPostEvent(m_pParent, evt);
    return 0;
}

Entry 方法在 wxThread 中执行实际工作,有关详细信息,请参阅documentation。在这种情况下,它会创建一个事件来设置参数,然后发布它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 2020-11-18
    • 2012-01-16
    • 2010-09-16
    • 1970-01-01
    • 2018-03-06
    相关资源
    最近更新 更多