zl程序教程

您现在的位置是:首页 >  后端

当前栏目

wxWidgets多线程技术(分离式建立于堆上HEAP;联合式可以建在STACK堆、栈上)

多线程技术 可以 建立 Stack Heap
2023-09-14 09:16:33 时间

1. wxwidgets支持多线程,类wxThread。【不建议在子线程中调用GUI函数】

2.线程间的通信:使用wxEvtHandler::AddPendingEvent或wxPostEvent。【这些方法都是线程安全的】

3.创建线程类MyThread继承wxThread,至少实现其中的Entry()方法。

class MyThread : public wxThread
{
public:
MyThread(wxImage* image, int* count):
m_image(image), m_count(count) {}
virtual void *Entry();
private:
wxImage* m_image;
int* m_count;
};

//

void *MyThread::Entry()
{
(* m_count) = m_image->CountColours();
// Use an existing event to notify the application
// when the count is done
wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED,
ID_COUNTED_COLORS);
wxGetApp().AddPendingEvent(event);
return NULL;
}

4.新建线程:初始化;调用Create()方法

MyThread *thread = new MyThread();
if ( thread->Create() != wxTHREAD_NO_ERROR )
{
wxLogError(wxT(“Can’t create thread!”));
}

5. 线程类型:分离式线程【启动后无需再管;wxTHREAD_DETACHED,默认值】、联合式线程【需等待返回结果<===Wait()方法;wxTHREAD_JOINABLE;】::通常建立前者,因为属于“防火式”,不像联合线程需要等待。

6.分离式建立于堆上HEAP;联合式可以建在STACK堆、栈上

7.不能创建全局的线程对象,会引起内存检测问题

8.指定Stack大小:利用Create方法。0表示采用系统默认值。

9.指定优先级:wxThread::SetPriority()。 0~100.【必须在Create方法之后,Run方法之前设置】

10.运行:线程创建后并没运行,需要通过wxThead::Run()启动线程,而后调用线程的Entry函数。

11.暂停与恢复:Pause和Resume

12.终止:分离式【运行完毕自动销毁;可以在执行完毕时发出事件Event】、联合式【利用IsAlive方法查询;Delete(线程周期性调用TestDestroy)】