Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // l2.cpp: определяет точку входа для консольного приложения.
- //
- #include "stdafx.h"
- #include <windows.h>
- #include <winspool.h>
- using namespace std;
- DWORD WINAPI ThreadProcSum(CONST LPVOID lpParam)
- {
- DWORD i;
- DWORD dwTemp;
- int PAUSE = 1000;
- TCHAR MessageBegin[256], MessageEnd[256];
- const int* Num = (const int*)lpParam;
- wsprintf(MessageBegin, TEXT("Thread number %d begin with sum\n"), Num);
- wsprintf(MessageEnd, TEXT("Thread number %d end with sum\n"), Num);
- PAUSE = 2500;
- CONST HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
- WriteConsole(hStdOut, MessageBegin, lstrlen(MessageBegin), &dwTemp, NULL);
- Sleep(PAUSE);
- WriteConsole(hStdOut, MessageEnd, lstrlen(MessageEnd), &dwTemp, NULL);
- ExitThread(0);
- }
- DWORD WINAPI ThreadProcMul(CONST LPVOID lpParam)
- {
- DWORD i;
- DWORD dwTemp;
- int PAUSE = 1000;
- TCHAR MessageBegin[256], MessageEnd[256];
- const int* Num = (const int*)lpParam;
- wsprintf(MessageBegin, TEXT("Thread number %d begin with mul\n"), Num);
- wsprintf(MessageEnd, TEXT("Thread number %d end with mul\n"), Num);
- PAUSE = 5000;
- CONST HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
- WriteConsole(hStdOut, MessageBegin, lstrlen(MessageBegin), &dwTemp, NULL);
- Sleep(PAUSE);
- WriteConsole(hStdOut, MessageEnd, lstrlen(MessageEnd), &dwTemp, NULL);
- ExitThread(0);
- }
- VOID Error(CONST HANDLE hStdOut, CONST LPCWSTR szMessage)
- {
- DWORD dwTemp;
- TCHAR szError[256];
- WriteConsole(hStdOut, szMessage, lstrlen(szMessage), &dwTemp, NULL);
- wsprintf(szError, TEXT("LastError = %d\r\n"), GetLastError());
- WriteConsole(hStdOut, szError, lstrlen(szError), &dwTemp, NULL);
- ExitProcess(0);
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- boolean fl=true;
- TCHAR szMessage[256];
- printf("Input count of thread: ");
- int THREADS_NUMBER, i, temp, COUNT_TASKS,TASKS_NOW,COUNT_THREAD_NOW;
- int SetNum[100],ThreadWork[100];
- DWORD dwTemp=0, Num[2];
- scanf_s("%d", &THREADS_NUMBER);
- printf("Input tasks 1-sum,2-mul,3-exit: \n");
- i = 0;
- do
- {
- scanf_s("%d", &temp);
- SetNum[i] = temp;
- i++;
- } while (temp != 3);
- COUNT_TASKS = i - 1;
- CONST HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
- HANDLE hThreads[100];
- if (THREADS_NUMBER > COUNT_TASKS)
- {
- THREADS_NUMBER = COUNT_TASKS;
- fl = false;
- }
- for (i = 0; i < THREADS_NUMBER; i++)
- {
- switch (SetNum[i])
- {
- case 1:
- hThreads[i] = CreateThread(NULL, 0, &ThreadProcSum, (LPVOID)(i+1), 0, NULL);
- break;
- case 2:
- hThreads[i] = CreateThread(NULL, 0, &ThreadProcMul, (LPVOID)(i+1), 0, NULL);
- break;
- default:
- break;
- }
- if (NULL == hThreads[i])
- {
- Error(hStdOut, TEXT("Failed to create thread.\r\n"));
- }
- }
- TASKS_NOW = THREADS_NUMBER-1;
- while ((TASKS_NOW <= COUNT_TASKS) && (fl==true) )
- {
- i = WaitForMultipleObjects(THREADS_NUMBER, hThreads, FALSE, INFINITE) - WAIT_OBJECT_0;
- TASKS_NOW++;
- switch (SetNum[TASKS_NOW])
- {
- case 1:
- hThreads[i] = CreateThread(NULL, 0, &ThreadProcSum, (LPVOID)(i +1), 0, NULL);
- break;
- case 2:
- hThreads[i] = CreateThread(NULL, 0, &ThreadProcMul, (LPVOID)(i +1), 0, NULL);
- break;
- default:
- break;
- }
- if (NULL == hThreads[i])
- {
- Error(hStdOut, TEXT("Failed to create thread.\r\n"));
- }
- }
- WaitForMultipleObjects(THREADS_NUMBER, hThreads, TRUE, INFINITE);
- for (i = 0; i < THREADS_NUMBER; i++)
- {
- CloseHandle(hThreads[i]);
- }
- ///////////////
- printf("End. ");
- scanf_s("%d", &THREADS_NUMBER);
- getchar();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement