Posts tagged ‘multi-threading’

现象

frame 窗口关闭时(似乎)已经强行关闭了所有线程,因此使用线程指针 Delete() 将出现内存错误。

解决方案

拦截程序菜单中的退出事件和主Frame的 wxEVT_CLOSE_WINDOW 事件(called when the user closes the frame via the window decorations),删除线程。参见 hats/MainFrame.cpp

更好的解决方案:有无一个统一的节点,所有导致应用程序关闭(主窗口关闭)的过程都在关闭主窗口之前调用这个节点,而这个节点又可以重载(虚拟)?

操作GUI

wxMutexGuiEnter();
// 进行 GUI 操作
// ...
wxMutexGuiLeave();

在非主线程(非GUI线程)中如果要对GUI进行直接操作就必须使用这种方法,否则会出现同步错误,引起程序非正常终止。

注意这种方法的局限性:多个线程对于GUI的操作严格互锁,交替进行。例如在非GUI线程中有下列代码:

wxMutexGuiEnter();
wxLogDebug(_T("%d..."), i);
wxMutexGuiLeave();

如果下拉主菜单,则Log窗口的输出暂时停止,待菜单回卷后才继续进行。

最安全的方法还是使用自定义命令事件传递,例如在非GUI线程中可以这样:

// send done event to give hint
wxCommandEvent doneEvent(wxEVT_COMMAND_MENU_SELECTED, TESTING_THREAD_DONE);
wxPostEvent(_frame, doneEvent);

TestDestroy() & Delete()

用来停止 work thread。

Continue reading ‘使用 wxWidgets 进行 Multi-threading 编程’ »

(Quoted from JavaScript多线程编程简介)

Concurrent.Thread 是一个允许 JavaScript 进行多线程编程的库,应用它可以大大缓解在 AJAX 开发中与异步通信相 关的困难。这是一个用 JavaScript 写成的免费的软件库,使用它的前提是遵守 Mozilla Public License 和 GNU General Public License 这两个协议。你可以从他们的网站 下载源代码。