
- •Файл Laba12.Cpp:
- •Int winapi WinMain(hinstance hInstance,hinstance hPrevInstance,lpstr lpszCmdLine,int nCmdShow)
- •If (!RegClass(WndProc,szClassName,color_window))
- •If (!hwnd) return false;
- •Int winapi WinMain(hinstance hInstance,hinstance hPrevInstance,lpstr lpszCmdLine,int nCmdShow)
- •If (!RegClass(WndProc,szClassName,color_window))
- •If (!hwnd) return false;
- •Int winapi WinMain(hinstance hInstance,hinstance hPrevInstance,lpstr lpszCmdLine,int nCmdShow)
- •If (!RegClass(WndProc,szClassName,color_window))
- •If (!hwnd) return false;
- •If (!hThread)
Int winapi WinMain(hinstance hInstance,hinstance hPrevInstance,lpstr lpszCmdLine,int nCmdShow)
{
MSG msg; HWND hwnd;
If (!RegClass(WndProc,szClassName,color_window))
return FALSE;
hwnd=CreateWindow(szClassName,"П",
WS_OVERLAPPEDWINDOW|WS_VISIBLE,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL);
If (!hwnd) return false;
while (GetMessage(&msg,0,0,0)) DispatchMessage(&msg);
return (int) msg.wParam;
}
BOOL RegClass(WNDPROC Proc,LPCTSTR szName,UINT brBackground)
{ WNDCLASS wc; wc.style=CS_HREDRAW|CS_VREDRAW;
wc.cbClsExtra=wc.cbWndExtra=0; wc.lpfnWndProc=Proc;
wc.hInstance=hInstance; wc.lpszClassName=szName;
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName=NULL;
return (RegisterClass(&wc)!=0);
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
static HANDLE hThread=0;
switch(msg)
{
case WM_CREATE:
break;
case WM_LBUTTONDOWN:
ts.hwnd=hwnd;
ts.n=5;
ts.a[0]=5;
ts.a[1]=6;
ts.a[2]=1;
ts.a[3]=2;
ts.a[4]=3;
ts.c=10;
if (hThread!=0) CloseHandle(hThread);
CreateThread(NULL,0,ThreadFunc,&ts,0,NULL);
break;
case WM_DESTROY:
CloseHandle(hThread);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,msg,wParam,lParam);
}
return 0;
}
DWORD WINAPI ThreadFunc(PVOID pvParam)
{ ThreadStr* pTs = (ThreadStr*)pvParam;
HDC hdc;
char str[200], str1[20];
hdc=GetDC(pTs->hwnd);
int i;
for(i=0;i<(pTs->n);i++)
{
pTs->a[i]=pTs->a[i]/(i+1);
}
strcpy(str,"");
for(i=(pTs->n-1);i>=0;i--)
{
pTs->a[i+1]=pTs->a[i];
sprintf(str1,"%.3f*x^%d+",pTs->a[i+1],i+1);
strcat(str,str1);
}
pTs->a[0]=pTs->c;
sprintf(str1,"%.3f=0",pTs->a[0]);
strcat(str,str1);
TextOut(hdc,10,10,str,strlen(str));
ReleaseDC(pTs->hwnd,hdc);
return 0;
}
Создать в приложении вторичный поток, входная функция которого выполняет вычитание многочленов и выводит результат в окно. Степень, коэффициенты многочленов и дескриптор окна передать входной функции вторичного потока в качестве параметра.
#include <stdio.h>
#include <windows.h>
#include <string.h>
#include <math.h>
#include <wchar.h>
#define QUANTITY 15001
#define BUTTON1 15002
BOOL RegClass(WNDPROC,LPCTSTR,UINT);
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE hInstance;
char szClassName[]="GraphClass";
int quantity;
HWND static button1;
wchar_t buf[100];
struct ThreadStr
{
HWND hwnd;
int n;//степень
int m1[10];
int m2[10];
int m3[10];
};
ThreadStr ts;
DWORD WINAPI ThreadFunc(PVOID); //входная функция вторичного потока
Int winapi WinMain(hinstance hInstance,hinstance hPrevInstance,lpstr lpszCmdLine,int nCmdShow)
{
MSG msg; HWND hwnd;
If (!RegClass(WndProc,szClassName,color_window))
return FALSE;
hwnd=CreateWindow(szClassName,"П",
WS_OVERLAPPEDWINDOW|WS_VISIBLE,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL);
If (!hwnd) return false;
while (GetMessage(&msg,0,0,0)) DispatchMessage(&msg);
return (int) msg.wParam;
}
BOOL RegClass(WNDPROC Proc,LPCTSTR szName,UINT brBackground)
{ WNDCLASS wc; wc.style=CS_HREDRAW|CS_VREDRAW;
wc.cbClsExtra=wc.cbWndExtra=0; wc.lpfnWndProc=Proc;
wc.hInstance=hInstance; wc.lpszClassName=szName;
wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName=NULL;
return (RegisterClass(&wc)!=0);
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
static HANDLE hThread=0;
switch(msg)
{
case WM_CREATE:
break;
case WM_LBUTTONDOWN:
ts.hwnd=hwnd;
// button1=CreateWindow (L"BUTTON",(LPCSTR)"Степень многочлена",WS_VISIBLE|WS_CHILD|,10,50,70,30,(HMENU)STORAGE_OFF,hInstance,NULL);
// quantity=CreateWindow (L"EDIT",_T(" "),WS_VISIBLE|WS_CHILD|WS_BORDER|ES_NUMBER,100,50,30,20,hwnd,(HMENU)QUANTITY,hInstance,NULL);
// GetWindowText(quantity,buf,sizeof(quantity));
// ts.n=_atoi(buf);
ts.n=5;
ts.m1[0]=1;
ts.m1[1]=5;
ts.m1[2]=8;
ts.m1[3]=2;
ts.m1[4]=6;
ts.m2[0]=2;
ts.m2[1]=4;
ts.m2[2]=6;
ts.m2[3]=2;
// ts.m2[4]=4;
if (hThread!=0) CloseHandle(hThread);
CreateThread(NULL,0,ThreadFunc,&ts,0,NULL);
break;
case WM_DESTROY:
CloseHandle(hThread);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,msg,wParam,lParam);
}
return 0;
}
DWORD WINAPI ThreadFunc(PVOID pvParam)
{
ThreadStr* pTs = (ThreadStr*)pvParam;
HDC hdc;
char str[200], str1[20];
hdc=GetDC(pTs->hwnd);
int i;
strcpy(str,"");
for (i=0;i<=pTs->n;i++)
{
pTs->m3[i]=pTs->m1[i]-pTs->m2[i];
sprintf(str1,"%d*x^%d+",pTs->m3[i], i);
strcat(str,str1);
}
TextOut(hdc,10,10,str,strlen(str));
ReleaseDC(pTs->hwnd,hdc);
/*int i;
for(i=0;i<(pTs->n);i++)
{
pTs->a[i]=pTs->a[i]/(i+1);
}
strcpy(str,"");
for(i=(pTs->n-1);i>=0;i--)
{
pTs->a[i+1]=pTs->a[i];
sprintf(str1,"%.3f*x^%d+",pTs->a[i+1],i+1);
strcat(str,str1);
}
pTs->a[0]=pTs->c;
sprintf(str1,"%.3f=0",pTs->a[0]);
strcat(str,str1);
TextOut(hdc,10,10,str,strlen(str));
ReleaseDC(pTs->hwnd,hdc);
*/
return 0;
}
Создать в приложении вторичный поток, входная функция которого вычисляет логарифм числа по произвольному основанию и выводит результат в окно. Основание, аргумент логарифма и дескриптор окна передать входной функции вторичного потока в качестве параметра.
#include <windows.h>
#include <math.h>
#include <iostream>
LONG WinProc(HWND, UINT, WPARAM, LPARAM);
void WINAPI ThreadProcess(LPVOID lpParam);
typedef struct _ThreadParams {
HWND hWnd;
double base;
double arg;
} tp;
HWND base_edit, arg_edit;
// WINMAIN
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR pCmdLine,
int nCmdShow)
{
char ProgName[]="Labrab";
char Title[]="Потоки";
HWND hWnd;
MSG msg;
//РЕГИСТРАЦИЯ ОКОННОГО КЛАССА
WNDCLASS w;
w.lpszClassName=ProgName;
w.hInstance=hInstance;
w.lpfnWndProc=(WNDPROC)WinProc;
w.hCursor=LoadCursor(NULL, IDC_ARROW);
w.hIcon=LoadIcon(NULL, IDI_APPLICATION);
w.lpszMenuName=NULL;
w.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
w.style=CS_HREDRAW | CS_VREDRAW;
w.cbClsExtra=0;
w.cbWndExtra=0;
if(!RegisterClass(&w)) return false;
//
hWnd=CreateWindow
(
ProgName, //имя класса
Title, //имя окна (заголовок)
WS_OVERLAPPEDWINDOW, //стиль окна
100, //x-координата окна
100, //y-координата окна
400, //ширина окна
200, //высота окна
NULL, // дескриптор родительского или окна владельца
NULL, // дескриптор меню или идентификатор дочернего окна
hInstance, // дескриптор экземпляра приложения
NULL // указатель на данные создания окна
);
tp ThreadParams;
ThreadParams.hWnd=hWnd;
ThreadParams.base=2;
ThreadParams.arg=256;
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&ThreadProcess, (void*)&ThreadParams, 0, NULL);
ShowWindow(hWnd, nCmdShow);
while(GetMessage(&msg, NULL, 0, 0)) //цикл обработки сообщений
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
//
void WINAPI ThreadProcess(void* lpParam){
tp *Params = (tp*)lpParam;
double result = log(Params->arg)/log(Params->base);
char buf[100];
HDC hdc = GetDC(Params->hWnd);
sprintf(buf, "Логарифм %1.0f по основанию %1.0f = %f", Params->arg, Params->base, result);
SetWindowText(Params->hWnd, buf);
ReleaseDC(Params->hWnd, hdc);
}
//ОКОННАЯ ПРОЦЕДУРА
LONG WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){
switch(msg){
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
break;
}
return 0;
}
РАЗНОСТЬ МНОГОЧЛЕНОВ
#include <windows.h>
#include <math.h>
#include <iostream>
#define n 3 //степень первого многочлена
#define m 3 //степень второго многочлена
LONG WinProc(HWND, UINT, WPARAM, LPARAM);
void WINAPI ThreadProcess(LPVOID lpParam);
typedef struct _ThreadParams {
HWND hWnd;
int Koef1[n];//массив с коэффициентами первого многочлена
int Koef2[m];//массив с коэффициентами второго многочлена
} tp;
HWND base_edit, arg_edit;
// WINMAIN
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR pCmdLine,
int nCmdShow)
{
char ProgName[]="Labrab";
char Title[]="Потоки";
HWND hWnd;
MSG msg;
//РЕГИСТРАЦИЯ ОКОННОГО КЛАССА
WNDCLASS w;
w.lpszClassName=ProgName;
w.hInstance=hInstance;
w.lpfnWndProc=(WNDPROC)WinProc;
w.hCursor=LoadCursor(NULL, IDC_ARROW);
w.hIcon=LoadIcon(NULL, IDI_APPLICATION);
w.lpszMenuName=NULL;
w.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
w.style=CS_HREDRAW | CS_VREDRAW;
w.cbClsExtra=0;
w.cbWndExtra=0;
if(!RegisterClass(&w)) return false;
//
hWnd=CreateWindow
(
ProgName, //имя класса
Title, //имя окна (заголовок)
WS_OVERLAPPEDWINDOW, //стиль окна
100, //x-координата окна
100, //y-координата окна
400, //ширина окна
200, //высота окна
NULL, // дескриптор родительского или окна владельца
NULL, // дескриптор меню или идентификатор дочернего окна
hInstance, // дескриптор экземпляра приложения
NULL // указатель на данные создания окна
);
tp ThreadParams;
ThreadParams.hWnd=hWnd;
///////// Коэффинциенты первого многочлена
ThreadParams.Koef1[0] = 3;
ThreadParams.Koef1[1] = 4;
ThreadParams.Koef1[2] = 6;
///////// Коэффинциенты второго многочлена
ThreadParams.Koef2[0]= 9;
ThreadParams.Koef2[1]= 8;
ThreadParams.Koef2[2]= 7;
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&ThreadProcess, (void*)&ThreadParams, 0, NULL);
ShowWindow(hWnd, nCmdShow);
while(GetMessage(&msg, NULL, 0, 0)) //цикл обработки сообщений
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
//
void WINAPI ThreadProcess(void* lpParam)
{
tp *Params = (tp*)lpParam;
int key;
////////массив коэффициентов результата-многочлена
int KoefRes[100];
/////случай, когда степень первого многочлена равна степени второго
if (n == m)
{
for(int i=0;i<n;i++)
{
KoefRes[i]=(Params->Koef1[i] - Params->Koef2[i]);
}
}
/////случай, когда степень первого многочлена больше степени второго
/*if (n > m)
{
for(int i=0;i<n;i++)
{
KoefRes[i] = Params->Koef1[i];
}
key=n-m;
for (int i=key;i<n;i++)
{
KoefRes[i]=(Params->Koef1[i] - Params->Koef2[i-key]);
}
}*/
/////случай, когда степень первого многочлена меньше степени второго
/*if (n < m)
{
for(int i=0;i<m;i++)
{
KoefRes[i] = Params->Koef1[i];
}
key=m-n;
for (int i=key;i<m;i++)
{
KoefRes[i]=(Params->Koef1[i-key] - Params->Koef2[i]);
}
}*/
char buf[100];
HDC hdc = GetDC(Params->hWnd);
sprintf(buf, "Многочлен = (%d)x^2 + (%d)x + (%d)", KoefRes[0],KoefRes[1],KoefRes[2]);
SetWindowText(Params->hWnd, buf);
ReleaseDC(Params->hWnd, hdc);
}
//ОКОННАЯ ПРОЦЕДУРА
LONG WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
break;
}
return 0;
}
8. Создать в приложении вторичный поток, входная функция которого выполняет сложение двух векторов и выводит результат в окно. Векторы и дескриптор окна передать входной функции вторичного потока в качестве параметра.
#include<windows.h>
#include<stdio.h>
LONG MyWinP(HWND,UINT,WPARAM,LPARAM);
DWORD WINAPI ThreadFunc(PVOID pvParam);
struct mnog
{
HWND hWnd;
int len[60],len2[60];
int n;
};
HINSTANCE hInst;
DWORD ID=4000;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
//setlocale(0,"RUS");
char ProgName[]="My window";
char Title[]="Сложение";
HWND hWnd;
MSG msg;
WNDCLASS w;
hInst=hInstance;
w.lpszClassName=ProgName;
w.hInstance=hInstance;
w.lpfnWndProc=(WNDPROC)MyWinP;
w.hCursor=LoadCursor(NULL,IDC_ARROW);
w.hIcon=LoadIcon(NULL,IDI_APPLICATION);
w.lpszMenuName=NULL;
w.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
w.style=CS_HREDRAW | CS_VREDRAW;
w.cbClsExtra=0;
w.cbWndExtra=0;
if(!RegisterClass(&w)) return false;
hWnd=CreateWindow(ProgName,Title,WS_OVERLAPPEDWINDOW,10,20,200,200,NULL,NULL,hInstance,NULL);
ShowWindow(hWnd,nCmdShow);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
DWORD WINAPI ThreadFunc(PVOID pvParam)
{
HDC hdc;
char buf[220];
char str[200];
int res[60];
int sym=0;
strcpy(buf," Результат: ");
for(int i=0;i<((mnog*)pvParam)->n;i++)
{
res[i]=((mnog*)pvParam)->len[i]+((mnog*)pvParam)->len2[i];
//sprintf(buf,"Slojenie = %d",sym);
sprintf(str," %d ",res[i]);
strcat(buf,str);
}
hdc=GetDC(((mnog*)pvParam)->hWnd);
TextOut(hdc,20,30,buf,strlen(buf));
ReleaseDC(((mnog*)pvParam)->hWnd,hdc);
return 0;
}
LONG MyWinP(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
static PAINTSTRUCT ps;
static HDC hdc;
static SECURITY_ATTRIBUTES sa;
static mnog par;
switch(msg)
{
case WM_CREATE:
sa.lpSecurityDescriptor=NULL;
sa.bInheritHandle=TRUE;
sa.nLength=sizeof(sa);
par.hWnd=hWnd;
par.n=4;
par.len[0]=50;
par.len[1]=25;
par.len[2]=75;
par.len[3]=100;
par.len2[0]=5;
par.len2[1]=45;
par.len2[2]=56;
par.len2[3]=13;
break;
case WM_SIZE:
break;
case WM_PAINT:
CreateThread(&sa,0,ThreadFunc,&par,0,&ID);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd,msg,wParam,lParam);
}
return 0;
}
СУММА ВЕКТОРОВ
#include <stdio.h>
#include <windows.h>
#include <math.h>
BOOL RegClass(WNDPROC,LPCTSTR,UINT);
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE hInstance;
char szClassName[]="GraphClass";
struct ThreadStr
{ HWND hwnd;
int v1[2];
int v2[2];
};
ThreadStr ts;
DWORD WINAPI ThreadFunc(PVOID); //входная функция вторичного потока