Advertisement
Guest User

Untitled

a guest
Feb 11th, 2016
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.72 KB | None | 0 0
  1. // ヘッダファイルのインクルード
  2. #include <windows.h> // 標準WindowsAPI
  3. #include <tchar.h> // TCHAR型
  4. #include <stdio.h> // 標準入出力
  5.  
  6. // スレッドの引数として渡す構造体THREAD_PARAMの定義.
  7. typedef struct{
  8. int m_iNo; // スレッド番号
  9. TCHAR m_tszMessage[32]; // スレッドが出力するメッセージ.
  10. }THREAD_PARAM; // これでTHREAD_PARAM型の完成.
  11.  
  12. // ThreadProc関数の定義
  13. DWORD WINAPI ThreadProc(LPVOID lpParameter){
  14.  
  15. // 変数の宣言
  16. int i; // ループ用変数i
  17. THREAD_PARAM *pTP; // THREAD_PARAM型ポインタpTP.
  18.  
  19. // 引数lpParameterをTHREAD_PARAM型のポインタにキャスト.
  20. pTP = (THREAD_PARAM *)lpParameter; // lpParameterをTHREAD_ARG型のポインタにキャストして, pTPに格納.
  21.  
  22. // 1から5までを出力.
  23. for (i = 1; i <= 5; i++){ // 1から5まで5回繰り返す.
  24.  
  25. // i, pTP->m_iNo, pTP->m_tszMessageを出力.
  26. _tprintf(_T("i = %d, m_iNo = %d, m_tszMessage = %s\n"), i, pTP->m_iNo, pTP->m_tszMessage); // _tprintfでi, pTP->m_iNo, pTP->m_tszMessageの値を出力.
  27. Sleep(1000); // Sleepで1秒休止.
  28.  
  29. }
  30.  
  31. // スレッドの終了
  32. ExitThread((DWORD)pTP->m_iNo); // ExitThreadにpTP->m_iNoを(DWORD)にキャストしたものを渡してスレッドを終了する.
  33.  
  34. }
  35.  
  36. // _tmain関数の定義
  37. int _tmain(int argc, TCHAR *argv[]){ // main関数のTCHAR版.
  38.  
  39. // 配列の宣言
  40. HANDLE hThread[5]; // HANDLE型スレッドハンドル配列hThread(要素数5)
  41. DWORD dwThreadId[5]; // DWORD型スレッドID配列dwThreadId(要素数5)
  42. THREAD_PARAM tp[5]; // 引数として渡すTHREAD_PARAM型配列tp.(要素数5)
  43. int i; // ループ用変数i.
  44. DWORD dwExitCode[5]; // DWORD型終了コード配列dwExitCode(要素数5)
  45.  
  46. // スレッドの一斉開始
  47. tp[0].m_iNo = 0; // m_iNo = 0
  48. _tcscpy(tp[0].m_tszMessage, _T("No.0")); // m_tszMessage = "No.0"
  49. hThread[0] = CreateThread(NULL, 0, ThreadProc, &tp[0], 0, &dwThreadId[0]); // CreateThreadでスレッド生成及び開始.(引数にtp[0]を渡している.)
  50.  
  51. // スレッドの一斉開始
  52. tp[1].m_iNo = 1; // m_iNo = 1
  53. _tcscpy(tp[1].m_tszMessage, _T("No.1")); // m_tszMessage = "No.1"
  54. hThread[1] = CreateThread(NULL, 0, ThreadProc, &tp[1], 0, &dwThreadId[1]); // CreateThreadでスレッド生成及び開始.(引数にtp[1]を渡している.)
  55.  
  56. // スレッドの一斉開始
  57. tp[2].m_iNo = 2; // m_iNo = 2
  58. _tcscpy(tp[2].m_tszMessage, _T("No.2")); // m_tszMessage = "No.2"
  59. hThread[2] = CreateThread(NULL, 0, ThreadProc, &tp[2], 0, &dwThreadId[2]); // CreateThreadでスレッド生成及び開始.(引数にtp[2]を渡している.)
  60.  
  61. // スレッドの一斉開始
  62. tp[3].m_iNo = 3; // m_iNo = 3
  63. _tcscpy(tp[3].m_tszMessage, _T("No.3")); // m_tszMessage = "No.3"
  64. hThread[3] = CreateThread(NULL, 0, ThreadProc, &tp[3], 0, &dwThreadId[3]); // CreateThreadでスレッド生成及び開始.(引数にtp[3]を渡している.)
  65.  
  66. // スレッドの一斉開始
  67. tp[4].m_iNo = 4; // m_iNo = 4
  68. _tcscpy(tp[4].m_tszMessage, _T("No.4")); // m_tszMessage = "No.4"
  69. hThread[4] = CreateThread(NULL, 0, ThreadProc, &tp[4], 0, &dwThreadId[4]); // CreateThreadでスレッド生成及び開始.(引数にtp[4]を渡している.)
  70.  
  71. // スレッドが終わるまで休止.
  72. Sleep(6000); // Sleepで6秒休止.
  73.  
  74. // 終了コード取得.
  75. for (i = 0; i < 5; i++){ // 5回繰り返す.
  76.  
  77. // i番目スレッドの終了コードを取得.
  78. GetExitCodeThread(hThread[i], &dwExitCode[i]); // GetExitCodeThreadで各スレッドの終了コードを取得.
  79. _tprintf(_T("dwExitCode[%d] = %lu\n"), i, dwExitCode[i]); // dwExitCode[i]の値を出力.
  80. if (hThread[i] != NULL){ // hThread[i]がNULLでない.
  81. CloseHandle(hThread[i]); // CloseHandleでhThread[i]を閉じる.
  82. }
  83.  
  84. }
  85.  
  86. // プログラムの終了
  87. return 0;
  88.  
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement