gpt4 book ai didi

c++ - Wxwidgets回调

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:48:10 32 4
gpt4 key购买 nike

我想在不卡住主应用程序的情况下向线程函数添加回调函数。

例如:当我点击一个按钮时,它会启动一个线程函数。我想在工作完成时通知用户。

谢谢

    cs functions;
pthread_t thread;
pthread_create(&thread, NULL, maFonction, (void*)&functions);
//pthread_join(thread, NULL);

pthread_join 在等待线程完成时阻塞主应用程序。那我该怎么做。非常感谢

最佳答案

通过在派生线程中调用 pthread_detach() 使线程处于分离状态,或者在主线程中创建线程时,将该线程的 pthread 属性设置为分离状态。现在线程已分离,您将不需要在主线程中调用 pthread_join()。接下来,在衍生线程本身中,在退出线程之前,将事件推送到衍生线程的 WxWidgets 对象的事件队列中,以“宣布”衍生线程已完成。最后,将线程完成事件的事件处理程序添加到 WxWidget 对象,以处理甚至派生的线程将放置在它的事件队列中。

例如,您可以创建一个类似 THREAD_FINISHED_EVENT 的事件,您的线程会将其推送到将生成线程的对象的事件队列中。您的代码如下所示:

wxCommandEvent event(THREAD_FINISHED_EVENT, GetId());

//"this" points to the parent WxWidgets object spawning the threads
//and allows you to access the "this" pointer in the handler
event.SetEventObject(this);

//Send the event
this->AddPendingEvent(event);

事件本身将在安装事件处理程序的 WxWidget 的主事件线程中处理。您只需要为 WxWidget 对象提供处理程序,并定义事件本身。这可以使用宏 DEFINE_EVENT_TYPE 来完成,然后将以下行添加到将自己生成线程的 WxWidget 对象的构造函数中:

//myWxWidget::thread_handler is the handler for your thread ending events
Connect(widgetID, THREAD_FINISHED_EVENT, wxCommandEventHandler(myWxWidget::thread_handler))

总而言之,下面是一些理论上的 WxWidgets 对象类:

//myWindowThreadClass.hpp
#include <wx/wx.h>
#include <wx/event.h>

extern expdecl const wxEventType THREAD_FINISHED_EVENT;

class myWindowThreadClass: public wxWindow
{
public:
myWindowThreadClass(wxWindow* parent, int id);

//handler for the thread-ending event
void thread_handler(wxCommandEvent& event);

//pushes a thread event on the wxWidgets event-queue
//for myWindowThreadClass
void send_thread_event();
};


//myWindowThreadClass.cpp
#include <myWindowthreadClass.h>
#include <pthread.h>

const wxEventType THREAD_FINISHED_EVENT = wxNewEventType();

void* thread_func(void* data)
{
myWindowThreadClass* window_ptr = static_cast<myWindowThreadClass*>(data);

//detach thread
pthread_detatch(pthread_self());

//... rest of thread function

window_ptr->send_thread_event();

return (void*)0;
}

myWindowThreadClass::myWindowThreadClass(wxWindow* parent, int id):
wxWindow(parent, id)
{
//enable the event handler
Connect(id, THREAD_FINISHED_EVENT, wxCommandEventHandler(myWindowThreadClass::thread_handler));

//create your threads
pthread_t tid;
for (int i=0; i < NUM_THREADS; i++)
{
pthread_create(&tid, NULL, thread_func, this);
}

//...do anything else needed to initialize object
}

void myWindowThreadClass::thread_handler(wxCommandEvent& event)
{
//handle the event
}

void myWindowThreadClass::send_thread_event()
{
wxCommandEvent event(THREAD_FINISHED_EVENT, GetId());
event.SetEventObject(this);

//Send the event ... import to use this function, as it will cause
//the event to be processed in main-thread, not spawned child threads
this->AddPendingEvent(event);
}

关于c++ - Wxwidgets回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7714734/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com