답변
단순히이 완료 될 때까지 백그라운드에서 뭔가 작업을해야하는 경우 -이 같은 화재와 당신이 경우 잊지 :
// warning: off the top of my head ;-)
class MyThread
: public wxThread
{
public:
MyThread() : wxThread(wxTHREAD_DETACHED)
{
if(wxTHREAD_NO_ERROR == Create()) {
Run();
}
}
protected:
virtual ExitCode Entry()
{
// do something here that takes a long time
// it's a good idea to periodically check TestDestroy()
while(!TestDestroy() && MoreWorkToDo()) {
DoSaidWork();
}
return static_cast<ExitCode>(NULL);
}
};
MyThread* thd = new MyThread(); // auto runs & deletes itself when finished
내가 함께 작업 한을 거의 모든 방법에서 wxWidgets의 스레드는 here으로 설명되어 있습니다. 처음에는 좀 더 복잡한 반면 사용자 정의 이벤트를 사용하면 장기간에 두통을 피할 수 있습니다. 합니다 (wxMessageQueue 클래스는 매우 좋은,하지만 난 그것을 사용 때 나는 누출을 발견, 그래도 약 1 년을 확인하지 않았습니다.)
기본 예 :
MyFrm.cpp을
#include "MyThread.h"
BEGIN_EVENT_TABLE(MyFrm,wxFrame)
EVT_COMMAND(wxID_ANY, wxEVT_MYTHREAD, MyFrm::OnMyThread)
END_EVENT_TABLE()
void MyFrm::PerformCalculation(int someParameter){
//create the thread
MyThread *thread = new Mythread(this, someParameter);
thread->Create();
thread->Run();
//Don't worry about deleting the thread, there are two types of wxThreads
//and this kind deletes itself when it's finished.
}
void MyFrm::OnMyThread(wxCommandEvent& event)
{
unsigned char* temp = (unsigned char*)event.GetClientData();
//do something with temp, which holds unsigned char* data from the thread
//GetClientData() can return any kind of data you want, but you have to cast it.
delete[] temp;
}
MyThread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <wx/thread.h>
#include <wx/event.h>
BEGIN_DECLARE_EVENT_TYPES()
DECLARE_EVENT_TYPE(wxEVT_MYTHREAD, -1)
END_DECLARE_EVENT_TYPES()
class MyThread : public wxThread
{
public:
MyThread(wxEvtHandler* pParent, int param);
private:
int m_param;
void* Entry();
protected:
wxEvtHandler* m_pParent;
};
#endif
MyThread.cpp
#include "MyThread.h"
DEFINE_EVENT_TYPE(wxEVT_MYTHREAD)
MyThread::MyThread(wxEvtHandler* pParent, int param) : wxThread(wxTHREAD_DETACHED), m_pParent(pParent)
{
//pass parameters into the thread
m_param = param;
}
void* MyThread::Entry()
{
wxCommandEvent evt(wxEVT_MYTHREAD, GetId());
//can be used to set some identifier for the data
evt.SetInt(r);
//whatever data your thread calculated, to be returned to GUI
evt.SetClientData(data);
wxPostEvent(m_pParent, evt);
return 0;
}
,536,
위키가 제공하는 것보다 훨씬 명확하고 간결한 예가 있습니다. 분명히 나는 실제로 응용 프로그램을 시작하는 것에 관한 코드를 생략했다. (wx 규칙은 MyApp.cpp를 만들 것이다.) 그리고 다른 비 스레드 관련 코드.
프로그램이 간단하고 스레드를 망치고 싶지 않은 경우 long 함수에서을 주기적으로 wxWindow :: Update()로 호출하는 것이 좋습니다.
몇 위를 구현에서 팁 : MingW32 및 Codeblocks를 사용
가 나는
warning: EVENT redeclared without dllimport attribute: previous dllimport ignored
다음 했어. 이벤트를 내보낼 필요가 없다면DEFINE_EVENT_TYPE
및DECLARE_EVENT_TYPE
대신DEFINE_LOCAL_EVENT_TYPE
및DECLARE_LOCAL_EVENT_TYPE
을 사용하십시오.SetClientData()
을 통해 개체를 전달하려면 분리형 스레드에new
연산자를 사용하여 데이터를 만들어야합니다. 호출 된 응용 프로그램은 복사 된 후에 데이터를delete
으로 가져야합니다.BEGIN_DECLARE_EVENT_TYPES() DECLARE_LOCAL_EVENT_TYPE(wxEVT_CALC_THREAD, -1) END_DECLARE_EVENT_TYPES() void* MyThread::Entry() { wxCommandEvent evt(wxEVT_CALC_THREAD, GetId()); // do some work vector<map<int, int> > *vm = new vector<map<int, int> >(); // perform operations with the object vm ... evt.SetClientData((void*)vm); wxPostEvent(m_pParent, evt); }
및 호출 응용 프로그램에서
이 : 예를 들어
DEFINE_LOCAL_EVENT_TYPE(wxEVT_CALC_THREAD)
// change this to your event table
BEGIN_EVENT_TABLE(..., ...)
EVT_COMMAND(wxID_ANY, wxEVT_CALC_THREAD, ThreadDone)
END_EVENT_TABLE()
void ThreadDone(wxCommandEvent& event)
{
vector<map<int, int> > *temp = (vector<map<int, int> > *)event.GetClientData();
// store the data in *temp
delete temp;
}
- 1. tkinter와 wxWidgets의 장단점?
- 2. wxWidgets의 이벤트 처리
- 3. wxwidgets의 검색 기능이있는 위젯
- 4. wxWidgets의 리소스 파일에서 애니메이션 GIF로드
- 5. Qt 또는 WxWidgets의 패널 자동 숨기기
- 6. Windows-7, wxWidgets의 연속 그리기 이벤트
- 7. 문자열의 크기를 결정하는 방법 wxWidgets의 현재 글꼴을 알려주십시오.
- 8. 스레드 스레딩 스레드 제어
- 9. 스레드 풀의 스레드
- 10. 스레드 및 스레드 스타트
- 11. 스레드 ID 스레드 이름에서
- 12. 스레드
- 13. 스레드
- 14. 스레드
- 15. 스레드
- 16. 스레드 우선 순위와 스레드 정확도
- 17. 하드웨어 스레드 대 부드러운 스레드?
- 18. 여러 스레드 대 단일 스레드
- 19. 스레드 풀 대 스레드 산란
- 20. 스레드 풀의 활성 스레드 번호
- 21. 배경 스레드 대 UI 스레드
- 22. 스레드 풀 스레드 수 제한
- 23. 스레드 수면 및 스레드 합류
- 24. 스레드 ID 대 스레드 핸들
- 25. 캐치 예외 스레드 외부 스레드
- 26. 스레드 풀의 최소 스레드 설정
- 27. 하나의 리더 스레드, 하나의 작성자 스레드, n 개의 작업자 스레드
- 28. AWT 이벤트 디스패처 스레드 멀티 스레딩 스레드 스레드
- 29. 다중 스레드 작업 라이브러리, Threading.Timer 또는 스레드?
- 30. UI와 백그라운드 스레드 간의 크로스 스레드
이 도움이 될 수 http://docs.wxwidgets.org/trunk/classwx_thread_helper.html – Aif
그리고 이것 ... http://wiki.wxwidgets.org/Inter-Thread_and_Inter-Process_communication – laher