- 论坛徽章:
- 24
|
可移植的线程间事件和控制台清屏函数 wxwidgets - #include <iostream>
- #include "wx/wxprec.h"
- #ifndef WX_PRECOMP
- #include "wx/wx.h"
- #endif
- #include "wx/thread.h"
- #ifdef _WIN32
- #include <windows.h>
- #include <conio.h>
- void clear_home()
- {
- CONSOLE_SCREEN_BUFFER_INFO si;
- HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
- GetConsoleScreenBufferInfo(h, &si);
- COORD c = {0, 0};
- DWORD n;
- FillConsoleOutputCharacter(h, ' ', si.dwSize.X * si.dwSize.Y, c, &n);
- SetConsoleCursorPosition(h, c);
- }
- #else
- #include <stdlib.h>
- #include <stdio.h>
- #include <termios.h>
- #include <string.h>
- #include <sys/ioctl.h>
- void clear_home()
- {
- puts("\033[2J\033[0;0H");
- }
- #endif
- class MyThread;
- enum
- {
- THREAD_QUIT = wxID_EXIT,
- THREAD_ABOUT = wxID_ABOUT,
- THREAD_TEXT = 101,
- THREAD_CLEAR,
- THREAD_START_THREAD = 201,
- THREAD_START_THREADS,
- THREAD_STOP_THREAD,
- THREAD_PAUSE_THREAD,
- THREAD_RESUME_THREAD,
- THREAD_START_WORKER,
- THREAD_EXEC_MAIN,
- THREAD_START_GUI_THREAD,
- THREAD_SHOWCPUS,
- WORKER_EVENT = wxID_HIGHEST+1, // this one gets sent from MyWorkerThread
- GUITHREAD_EVENT // this one gets sent from MyGUIThread
- };
- class MyApp : public wxAppConsole
- {
- public:
- MyApp();
- virtual ~MyApp() {};
- virtual bool OnInit();
- void OnWorkerEvent(wxThreadEvent& event);
- void OnExitEvent(wxThreadEvent& event);
- wxDECLARE_EVENT_TABLE();
- };
- wxBEGIN_EVENT_TABLE(MyApp, wxAppConsole)
- EVT_THREAD(WORKER_EVENT, MyApp::OnWorkerEvent)
- EVT_THREAD(THREAD_QUIT, MyApp::OnExitEvent)
- wxEND_EVENT_TABLE()
- class MyThread : public wxThread
- {
- public:
- MyThread(MyApp *p_app);
- virtual ~MyThread();
- // thread execution starts here
- virtual void* Entry();
- public:
- unsigned m_count;
- MyApp *mp_app;
- };
- MyApp::MyApp()
- {
- }
- bool MyApp::OnInit()
- {
- if ( !wxAppConsole::OnInit() )
- return false;
- MyThread *thread = new MyThread(this);
- if ( thread->Create() != wxTHREAD_NO_ERROR )
- {
- std::cout << "Can't create thread! " << std::endl;
- //wxLogError(wxT("Can't create thread!"));
- }
- thread->Run();
- return true;
- }
- void MyApp::OnWorkerEvent(wxThreadEvent& event)
- {
- int n = event.GetInt();
- std::cout << "thread event : " << n << std::endl;
- }
- void MyApp::OnExitEvent(wxThreadEvent& event)
- {
- clear_home();
- exit(0);
- }
- MyThread::MyThread(MyApp *p_app)
- : wxThread()
- {
- m_count = 0;
- mp_app = p_app;
- }
- MyThread::~MyThread()
- {
- }
- wxThread::ExitCode MyThread::Entry()
- {
- wxThreadEvent event( wxEVT_THREAD, WORKER_EVENT );
- for (int m_count = 0; m_count < 10; m_count++ )
- {
- wxThread::Sleep(1000);
- event.SetInt( m_count );
- wxQueueEvent( mp_app, event.Clone() );
- }
- wxThread::Sleep(2000);
- wxThreadEvent event_quit( wxEVT_THREAD, THREAD_QUIT );
- wxQueueEvent( mp_app, event_quit.Clone() );
- return NULL;
- }
- int main(int argc, char **argv)
- {
- wxInitializer initializer;
- MyApp *myapp = new MyApp();
- myapp->OnInit();
- myapp->MainLoop();
- }
复制代码 |
|