Advertisement
Guest User

Untitled

a guest
Oct 31st, 2014
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.72 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. typedef struct
  11. {
  12. int Number;
  13. int Task;
  14. /* всё, что душе угодно */
  15. } StructToThread;
  16.  
  17. DWORD dwCounter = 0;
  18. DWORD WINAPI ThreadProcSum(CONST LPVOID lpParam)
  19. {
  20. DWORD i;
  21. DWORD dwTemp;
  22. int PAUSE = 1000;
  23. TCHAR MessageBegin[256], MessageEnd[256];
  24. const int* Num = (const int*)lpParam;
  25. wsprintf(MessageBegin, TEXT("Thread number %d begin with sum\n"), Num);
  26. wsprintf(MessageEnd, TEXT("Thread number %d end with sum\n"), Num);
  27. PAUSE = 2500;
  28. CONST HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
  29. WriteConsole(hStdOut, MessageBegin, lstrlen(MessageBegin), &dwTemp, NULL);
  30. dwCounter++;
  31. Sleep(PAUSE);
  32. WriteConsole(hStdOut, MessageEnd, lstrlen(MessageEnd), &dwTemp, NULL);
  33. ExitThread(0);
  34. }
  35. DWORD WINAPI ThreadProcMul(CONST LPVOID lpParam)
  36. {
  37. DWORD i;
  38. DWORD dwTemp;
  39. int PAUSE = 1000;
  40. TCHAR MessageBegin[256], MessageEnd[256];
  41. const int* Num = (const int*)lpParam;
  42. wsprintf(MessageBegin, TEXT("Thread number %d begin with mul\n"), Num);
  43. wsprintf(MessageEnd, TEXT("Thread number %d end with mul\n"), Num);
  44. PAUSE = 5500;
  45. CONST HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
  46. WriteConsole(hStdOut, MessageBegin, lstrlen(MessageBegin), &dwTemp, NULL);
  47. dwCounter++;
  48. Sleep(PAUSE);
  49. WriteConsole(hStdOut, MessageEnd, lstrlen(MessageEnd), &dwTemp, NULL);
  50. ExitThread(0);
  51. }
  52.  
  53. VOID Error(CONST HANDLE hStdOut, CONST LPCWSTR szMessage)
  54. {
  55. DWORD dwTemp;
  56. TCHAR szError[256];
  57. WriteConsole(hStdOut, szMessage, lstrlen(szMessage), &dwTemp, NULL);
  58. wsprintf(szError, TEXT("LastError = %d\r\n"), GetLastError());
  59. WriteConsole(hStdOut, szError, lstrlen(szError), &dwTemp, NULL);
  60. ExitProcess(0);
  61. }
  62. int _tmain(int argc, _TCHAR* argv[])
  63. {
  64.  
  65. TCHAR szMessage[256];
  66. printf("Input count of thread: ");
  67. int THREADS_NUMBER, i, temp, COUNT_TASKS,TASKS_NOW,COUNT_THREAD_NOW;
  68. int SetNum[100],ThreadWork[100];
  69. DWORD dwTemp=0, Num[2];
  70. scanf_s("%d", &THREADS_NUMBER);
  71. printf("Input tasks 1-sum,2-mul,3-exit: \n");
  72. i = 0;
  73. do
  74. {
  75. scanf_s("%d", &temp);
  76. SetNum[i] = temp;
  77. i++;
  78. } while (temp != 3);
  79. COUNT_TASKS = i - 1;
  80. printf("OK0\n");
  81. CONST HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
  82.  
  83.  
  84.  
  85.  
  86. HANDLE hThreads[100];
  87. /*for (i = 0; i < THREADS_NUMBER; i++)
  88. {
  89. ThreadWork[i] = 0;
  90. }
  91. TASKS_NOW = 0;
  92. i = 0;
  93. COUNT_THREAD_NOW = 0;
  94. while (TASKS_NOW < COUNT_TASKS)
  95. {
  96. while ((THREADS_NUMBER > i) && (TASKS_NOW < COUNT_TASKS))
  97. {
  98. switch (SetNum[TASKS_NOW])
  99. {
  100. case 1:
  101. hThreads[i] = CreateThread(NULL, 0, &ThreadProcSum, (LPVOID)(i + 1), 0, NULL);
  102. break;
  103. case 2:
  104. hThreads[i] = CreateThread(NULL, 0, &ThreadProcMul, (LPVOID)(i + 1), 0, NULL);
  105. break;
  106. default:
  107. break;
  108. }
  109. i++;
  110. ThreadWork[i] = 1;
  111. }
  112.  
  113. }
  114. */
  115. for (i = 0; i < THREADS_NUMBER; i++)
  116. {
  117. switch (SetNum[i])
  118. {
  119. case 1:
  120. hThreads[i] = CreateThread(NULL, 0, &ThreadProcSum, (LPVOID)(i+1), 0, NULL);
  121. break;
  122. case 2:
  123. hThreads[i] = CreateThread(NULL, 0, &ThreadProcMul, (LPVOID)(i+1), 0, NULL);
  124. break;
  125. default:
  126. break;
  127. }
  128. if (NULL == hThreads[i])
  129. {
  130. Error(hStdOut, TEXT("Failed to create thread.\r\n"));
  131. }
  132. }
  133. WaitForMultipleObjects(THREADS_NUMBER, hThreads, TRUE, INFINITE);
  134.  
  135. printf("OK2\n");
  136. wsprintf(szMessage, TEXT("Counter = %d\r\n"), dwCounter);
  137. WriteConsole(hStdOut, szMessage, lstrlen(szMessage), &dwTemp, NULL);
  138.  
  139. for (i = 0; i < THREADS_NUMBER; i++)
  140. {
  141. CloseHandle(hThreads[i]);
  142. }
  143.  
  144.  
  145.  
  146.  
  147. ///////////////
  148.  
  149. printf("End. ");
  150. scanf_s("%d", &THREADS_NUMBER);
  151. getchar();
  152. return 0;
  153. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement