Outlookに他人の予定表を表示させる方法を追加
thread
http://kaworu.jpn.org/cpp/std::thread::thread
CreateRemoteThread関数
_beginthreadex (CRT)
http://www.geocities.jp/debu0510/personal/kusosure.html
#include <process.h>
//スレッドを作るとき
//戻り値:成功=スレッドハンドル 失敗=0
uintptr_t _beginthreadex(
void *security,//SECURITY_ATTRIBUTES 構造体へのポインタ またはNULL
unsigned stack_size,//スタックサイズ。0でもよい
unsigned ( *start_address )( void * ),//スレッド関数のアドレス
void *arglist,//スレッドに渡す引数、またはNULL
unsigned initflag,//0(すぐ実行) またはCREATE_SUSPENDED(一時停止)
unsigned *thrdaddr//スレッド識別子。NULLでも可。
);
unsigned __stdcall 関数名(void *p);//スレッド関数の型
void _endthreadex( unsigned 戻り値 );//スレッドが終わるとき
--
handoru = (HANDLE)_beginthreadex(NULL, 0, sure1, "sure1です。", 0, NULL);
WaitForSingleObject(handoru, INFINITE); /* スレッドが終了するまで待つ。 */
CloseHandle(handoru); /* ハンドルを閉じる */
--
HANDLE handoru[2];
InitializeCriticalSection(&cs);/* クリティカルセクション初期化! */
handoru[0] = (HANDLE)_beginthreadex(NULL, 0, sure1, NULL, 0, NULL);
handoru[1] = (HANDLE)_beginthreadex(NULL, 0, sure2, NULL, 0, NULL);
/* スレッドが終了するまで待つ */
WaitForMultipleObjects(2, handoru, TRUE, INFINITE);
CloseHandle(handoru[0]);
CloseHandle(handoru[1]);
DeleteCriticalSection(&cs);/* クリティカルセクション終わり */
--
SetThreadPriority(hThread, THREAD_PRIORITY_TIME_CRITICAL);
優先順位 高い方から
THREAD_PRIORITY_TIME_CRITICAL
THREAD_PRIORITY_HIGHEST
THREAD_PRIORITY_ABOVE_NORMAL
THREAD_PRIORITY_NORMAL
THREAD_PRIORITY_BELOW_NORMAL
THREAD_PRIORITY_LOWEST
THREAD_PRIORITY_IDLE
--
WaitForSingleObject(handoru, INFINITE); /* スレッドが終了するまで待つ。 */
DWORD WaitForSingleObject(
HANDLE hHandle, // オブジェクトのハンドル
DWORD dwMilliseconds // タイムアウト時間
);
https://msdn.microsoft.com/ja-jp/library/cc429427.aspx
DWORD dwMilliseconds // タイムアウト時間 msec もしくは INFINITE
return value
- WAIT_ABANDONED
- WAIT_OBJECT_0 => signal 状態になった
- WAIT_TIMEOUT => タイムアウト時間が経過し非 signal 状態
DWORD WaitForMultipleObjects(
DWORD nCount, // 配列内のハンドルの数
CONST HANDLE *lpHandles, // オブジェクトハンドルからなる配列
BOOL fWaitAll, // 待機オプション
DWORD dwMilliseconds // タイムアウト時間
);
fWaitAll
TRUE: すべてがシグナル状態になった時返却
FALSE: どれか一つ
------------------------------------------------------------
http://murank.github.io/wxwidgetsjp/2.8.12/wx_wxthreadoverview.html
http://docs.wxwidgets.org/trunk/classwx_thread.html
#include <wx/thread.h>
wxMutes, wxCriticalSection
types
- detached (defalut)
delete themselves when they complete or call to Delete()
must be created by "new"
- joinable (Win32 supports this only)
// declare a new type of event
wxDECLARE_EVENT(wxEVT_COMMAND_MYTHREAD_COMPLETED, wxThreadEvent);
wxDECLARE_EVENT(wxEVT_COMMAND_MYTHREAD_UPDATE, wxThreadEvent);
( wxDECLARE_EVENT(name, class) カスタムイベントの宣言
wxDEFINE_EVENT() で定義される変数 name を宣言。class は wxEventの派生クラス
( wxThreadEvt wxEventの派生 http://docs.wxwidgets.org/trunk/classwx_thread_event.html )
class MyThread : public wxThread
{
...
protected:
virtual ExitCode Entry();
MyFrame *m_pHandler;
};
class MyFrame : public wxFrame
{
public:
void DoStartThread();
void DoPauseThread();
// a resume routine would be nearly identic to DoPauseThread()
void DoResumeThread() { ... }
void OnThreadUpdate(wxThreadEvent&);
void OnThreadCompletion(wxThreadEvent&);
void OnClose(wxCloseEvent&);
protected:
MyThread* m_pThread;
friend class MyThread;
wxDECLARE_EVENT_TABLE(); // static イベントハンドラ列挙の代わりとなるマクロ
// クラス内で使う。実体は wxBEGIN_EVENT_TABLE() and the wxEND_EVENT_TABLE()
};
// クラス内でこの後 static イベントハンドラを列挙するときに使う。
wxBEGIN_EVENT_TABLE(MyFrame, wxFrame) // (theClass, baseClass)
EVT_CLOSE(MyFrame::OnClose) // CLOSEイベントは MyFrame::OnClose(handler) を呼ぶ
EVT_MENU(wxID_EXIT, MyFrame::OnExit) // wxID_EXIT はhanlderのパラメータ
EVT_COMMAND(wxID_ANY, wxEVT_COMMAND_MYTHREAD_COMPLETED, MyFrame::OnThreadCompletion)
wxEND_EVENT_TABLE()
wxDEFINE_EVENT(wxEVT_COMMAND_MYTHREAD_COMPLETED, wxThreadEvent);
wxDEFINE_EVENT(wxEVT_COMMAND_MYTHREAD_UPDATE, wxThreadEvent);
// イベントクラスに関連付けられた新しいイベントの定義
.. MyThread::Entry()
{
while ( !TestDestroy() ) { .... }
// signal event handler that this thread is going to be destroyed.
wxQueueEvent(m_pHandler, new wxThreadEvent(wxEVT_COMMAND_MYTHREAD_COMPLETED) );
return ..
}
void wxQueueEvent(wxEvtHandler* dest, wxEvent* event)
wxEvtHander::QueueEvent() の wrapper
event が来たら即実行
worker thread から main thread への通知に使われる
http://docs.wxwidgets.org/trunk/overview_thread.html
sample
https://github.com/wxWidgets/wxWidgets/blob/master/samples/thread/thread.cpp
EVT_MENU(THREAD_START_THREADS, MyFrame::OnStartThreads)
メニューが押されたら OnStartThreads
void MyFrame::OnStartThreads(wxCommandEvent& WXUNUSED(event) )
{
for ( n = 0; n < count; n++ ) {
wxThread *thr = CreateThread(); // 全スレッド生成
...
threads.Add(thr);
}
for ( n = 0; n < count; n++ ) {
threads[n]->Run(); // 開始
}
}
----
EVT_MENU(THREAD_START_WORKER, MyFrame::OnStartWorker)
void MyFrame::OnStartWorker(wxCommandEvent& WXUNUSED(event))
{
MyWorkerThread *thread = new MyWorkerThread(this);
if ( thread->Create() != wxTHREAD_NO_ERROR ) {..}
m_dlgProgress = new wxProgressDialog(..., this, ...); 自分を登録
thread->Run();
}
void MyFrame::OnWorkerEvent(wxThreadEvent& event)
{
int n = event.GetInt();
if ( n == -1 ) {
m_dlgProgress->Destroy();
m_dlgProgress = (wxProgressDialog *)NULL;
..
... MyWorkerThread::Entry()
{
wxThreadEvent event( wxEVT_THREAD, WORKER_EVENT );
event.SetInt( 50 );
wxQueueEvent( m_frame, event.Clone() );
}
----------------------------------------
wxCriticalSection
一つのオブジェクトの排他制御ができる
CRITICAL_SECTION CriticalSection;
::InitializeCriticalSection( &CriticalSection );
::EnterCriticalSection( &CriticalSection ); // 待機
// スレッド処理
::LeaveCriticalSection( &CriticalSection ); // 解放
::DeleteCriticalSection( &CriticalSection );
構造体 CRITICAL_SECTION は完全ブラックボックス
wxCriticalSectionLocker