Advertisement
Guest User

Untitled

a guest
Oct 31st, 2014
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.50 KB | None | 0 0
  1. // l2.cpp: определяет точку входа для консольного приложения.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <windows.h>
  6. #include <winspool.h>
  7. using namespace std;
  8.  
  9.  
  10. DWORD WINAPI ThreadProcSum(CONST LPVOID lpParam)
  11. {
  12. DWORD i;
  13. DWORD dwTemp;
  14. int PAUSE = 1000;
  15. TCHAR MessageBegin[256], MessageEnd[256];
  16. const int* Num = (const int*)lpParam;
  17. wsprintf(MessageBegin, TEXT("Thread number %d begin with sum\n"), Num);
  18. wsprintf(MessageEnd, TEXT("Thread number %d end with sum\n"), Num);
  19. PAUSE = 2500;
  20. CONST HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
  21. WriteConsole(hStdOut, MessageBegin, lstrlen(MessageBegin), &dwTemp, NULL);
  22. Sleep(PAUSE);
  23. WriteConsole(hStdOut, MessageEnd, lstrlen(MessageEnd), &dwTemp, NULL);
  24. ExitThread(0);
  25. }
  26. DWORD WINAPI ThreadProcMul(CONST LPVOID lpParam)
  27. {
  28. DWORD i;
  29. DWORD dwTemp;
  30. int PAUSE = 1000;
  31. TCHAR MessageBegin[256], MessageEnd[256];
  32. const int* Num = (const int*)lpParam;
  33. wsprintf(MessageBegin, TEXT("Thread number %d begin with mul\n"), Num);
  34. wsprintf(MessageEnd, TEXT("Thread number %d end with mul\n"), Num);
  35. PAUSE = 5000;
  36. CONST HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
  37. WriteConsole(hStdOut, MessageBegin, lstrlen(MessageBegin), &dwTemp, NULL);
  38. Sleep(PAUSE);
  39. WriteConsole(hStdOut, MessageEnd, lstrlen(MessageEnd), &dwTemp, NULL);
  40. ExitThread(0);
  41. }
  42.  
  43. VOID Error(CONST HANDLE hStdOut, CONST LPCWSTR szMessage)
  44. {
  45. DWORD dwTemp;
  46. TCHAR szError[256];
  47. WriteConsole(hStdOut, szMessage, lstrlen(szMessage), &dwTemp, NULL);
  48. wsprintf(szError, TEXT("LastError = %d\r\n"), GetLastError());
  49. WriteConsole(hStdOut, szError, lstrlen(szError), &dwTemp, NULL);
  50. ExitProcess(0);
  51. }
  52. int _tmain(int argc, _TCHAR* argv[])
  53. {
  54. boolean fl=true;
  55. TCHAR szMessage[256];
  56. printf("Input count of thread: ");
  57. int THREADS_NUMBER, i, temp, COUNT_TASKS,TASKS_NOW,COUNT_THREAD_NOW;
  58. int SetNum[100],ThreadWork[100];
  59. DWORD dwTemp=0, Num[2];
  60. scanf_s("%d", &THREADS_NUMBER);
  61. printf("Input tasks 1-sum,2-mul,3-exit: \n");
  62. i = 0;
  63. do
  64. {
  65. scanf_s("%d", &temp);
  66. SetNum[i] = temp;
  67. i++;
  68. } while (temp != 3);
  69. COUNT_TASKS = i - 1;
  70. CONST HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
  71. HANDLE hThreads[100];
  72. if (THREADS_NUMBER > COUNT_TASKS)
  73. {
  74. THREADS_NUMBER = COUNT_TASKS;
  75. fl = false;
  76. }
  77. for (i = 0; i < THREADS_NUMBER; i++)
  78. {
  79. switch (SetNum[i])
  80. {
  81. case 1:
  82. hThreads[i] = CreateThread(NULL, 0, &ThreadProcSum, (LPVOID)(i+1), 0, NULL);
  83. break;
  84. case 2:
  85. hThreads[i] = CreateThread(NULL, 0, &ThreadProcMul, (LPVOID)(i+1), 0, NULL);
  86. break;
  87. default:
  88. break;
  89. }
  90. if (NULL == hThreads[i])
  91. {
  92. Error(hStdOut, TEXT("Failed to create thread.\r\n"));
  93. }
  94. }
  95. TASKS_NOW = THREADS_NUMBER-1;
  96. while ((TASKS_NOW <= COUNT_TASKS) && (fl==true) )
  97. {
  98.  
  99. i = WaitForMultipleObjects(THREADS_NUMBER, hThreads, FALSE, INFINITE) - WAIT_OBJECT_0;
  100.  
  101. TASKS_NOW++;
  102. switch (SetNum[TASKS_NOW])
  103. {
  104. case 1:
  105. hThreads[i] = CreateThread(NULL, 0, &ThreadProcSum, (LPVOID)(i +1), 0, NULL);
  106. break;
  107. case 2:
  108. hThreads[i] = CreateThread(NULL, 0, &ThreadProcMul, (LPVOID)(i +1), 0, NULL);
  109. break;
  110. default:
  111. break;
  112. }
  113. if (NULL == hThreads[i])
  114. {
  115. Error(hStdOut, TEXT("Failed to create thread.\r\n"));
  116. }
  117. }
  118.  
  119. WaitForMultipleObjects(THREADS_NUMBER, hThreads, TRUE, INFINITE);
  120.  
  121. for (i = 0; i < THREADS_NUMBER; i++)
  122. {
  123. CloseHandle(hThreads[i]);
  124. }
  125.  
  126. ///////////////
  127.  
  128. printf("End. ");
  129. scanf_s("%d", &THREADS_NUMBER);
  130. getchar();
  131. return 0;
  132. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement