13. Сформулируйте назначение и объясните параметры функции CreateThread().
14. Когда следует использовать функцию CreateThread()?
15. Какие функции используются для завершения потока?
16. Составьте и выполните программу с использованием функции CreateThread().
5. ЛИТЕРАТУРА
1. Сетевые операционные системы / В.Г. Олифер, Н.А. Олифер. – СПб.: Питер, 2001,
стр. 87 – 140.
2. Румянцев П.В. Азбука программирования в Win32 API. - М.: Радио и связь - Телеком, 1999, стр. 217 – 237.
3. Вильямс А. Системное программирование в Windows 2000 для профессиналов. – СПб.: Питер, 2001, стр. 147 – 168.
Приложение 1.
// Программа,демонстрирующая использование функций
// Win32 API - WinExec() и ShellExecute().
// С помощью функции WinExec()программа открывает блокнот Notepad
// с загрузкой текстового файла в блокнот.
// С помощью функции ShellExecute()программа запускает
// проводник Windows, файл explorer.exe.
// Тип приложения Win32, Console
#include <windows.h>
#include <iostream.h>
void main(int argc, char *argv[])
{
cout << "Use WinExec\n";
// Открываем файл support.txt с помощью блокнота notepad.exe
if (WinExec("notepad c:\\windows\\support.txt", SW_SHOW)<32)
MessageBox(NULL, "Ошибка запуска WinExec", NULL,MB_OK);//Если ошибка
cout<<"Press Enter\n";
MessageBox(NULL, "Для продолжения нажмите OK",
"Программа запущена!",MB_OK);
cout<<"Use function ShellExecute";
// Запуск Explorer.exe с помощью ShellExecute()
if (ShellExecute(NULL,"open","c:\\windows\\explorer.exe",NULL,
NULL, SW_SHOW)<(HANDLE)32)
MessageBox(NULL, "Ошибка запуска ShellExecute", NULL,MB_OK);
}
Приложение 2
//демонстрационная программа создания и уничтожения процессов
//тип приложения Win32, GUI
#include <windows.h>
#include <stdio.h>
#include "proc.h"
LRESULT CALLBACK ProcessesWndProc(HWND,UINT,UINT,LONG);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPSTR lpszCmdParam, int nCmdShow )
{
HWND hWnd;
WNDCLASS WndClass;
MSG Msg;
char szClassName[]="Processes";
/*Регистрация класса окна*/
WndClass.style = CS_HREDRAW|CS_VREDRAW;
WndClass.lpfnWndProc = ProcessesWndProc;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hInstance=hInstance;
WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClass.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.lpszMenuName = "ProcessesMenu";
WndClass.lpszClassName = szClassName;
if(!RegisterClass(&WndClass))
{
MessageBox(NULL, "Ошибка регистрации класса", "Ошибка!", MB_OK);
return 0;
}
hWnd = CreateWindow(szClassName,"Program No 1",
WS_OVERLAPPEDWINDOW|WS_VSCROLL|WS_HSCROLL,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL,
hInstance, NULL);
if(!hWnd)
{
MessageBox(NULL, "Ошибка создания окна", "Ошибка!",MB_OK);
return 0;
}
//Отображение окна
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
//Начало цикла обработки сообщений
while(GetMessage(&Msg, NULL,0,0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
LRESULT CALLBACK ProcessesWndProc(HWND hWnd, UINT Message,
UINT wParam,LONG lParam)
{
const Max = 10;
STARTUPINFO StartupInfo;
static int ProcessNumber=0;
static int ProcessInfo;
static PROCESS_INFORMATION ProcessInformation[Max];
static char cMyMessage[80];
static HMENU hSubMenu;
UINT uExitCode;
switch(Message)
{
case WM_CREATE:
hSubMenu=GetSubMenu(GetMenu(hWnd),0);
return 0;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDM_New_Process:
if(ProcessNumber<Max)
{
StartupInfo.cb=sizeof(STARTUPINFO);
StartupInfo.lpReserved=NULL;
StartupInfo.lpDesktop=NULL;
StartupInfo.lpTitle=NULL;
StartupInfo.dwFlags=STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow=SW_SHOWNORMAL;
StartupInfo.cbReserved2=0;
StartupInfo.lpReserved=NULL;
if(CreateProcess(NULL,"Notepad.exe",NULL,NULL,
FALSE,0,NULL,NULL, &StartupInfo,
&(ProcessInformation[ProcessNumber])))
{
ProcessNumber++;
wsprintf(cMyMessage,
"hProcess is %x,\n hThread is %x,\n dwProcessId is %x,\n \
dwThreadId is %x",
ProcessInformation[ProcessNumber-1].hProcess,
ProcessInformation[ProcessNumber-1].hThread,
ProcessInformation[ProcessNumber-1].dwProcessId,
ProcessInformation[ProcessNumber-1].dwThreadId);
MessageBox(hWnd,cMyMessage,"Процесс создан!",MB_OK);
EnableMenuItem(hSubMenu,IDM_Kill_Process,
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.