Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архив1 / docx54 / Отчет №1.docx
Скачиваний:
23
Добавлен:
01.08.2013
Размер:
209.03 Кб
Скачать

Создать процесс запускающий блокнот

#include <stdio.h>

#include "windows.h"

#include <iostream>

using namespace std;

void main()

{

STARTUPINFO cif;

ZeroMemory(&cif,sizeof(STARTUPINFO));

PROCESS_INFORMATION pi;

if (CreateProcess(L"c:\\windows\\notepad.exe",NULL,

NULL,NULL,FALSE,NULL,NULL,NULL,&cif,&pi)==TRUE)

{

cout << "Handle:" << pi.hProcess << endl;

system("Pause");

TerminateProcess(pi.hProcess,NO_ERROR); // убрать процесс

}

}

Создать процесс и передать наследуемый дескриптор его родителю

В качестве наследуемого дескриптора передается дескриптор файла. В файле father создается файл, и записывается строчка, а затем дескриптор файла в качестве аргумента командной строки передается дочернему файлу child.

patherproc.cpp

#include <Windows.h>

#include <stdio.h>

#include <iostream>

using namespace std;

// путь к исполняемому файлу child

#define CHILD_PROCESS_PATH "D:\Study\Системное программирование\Task1\childproc\Debug\\childproc.exe"

int main(int argc, char *argv[])

{

SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE};

HANDLE hFile = CreateFile("Test", GENERIC_WRITE, 0, &sa, OPEN_ALWAYS, 0, 0);

char buf[100];

DWORD nWritten;

STARTUPINFO startupInfo;

PROCESS_INFORMATION processInfo;

printf("father handle: %d\n", hFile);

sprintf(buf, "%s %u", CHILD_PROCESS_PATH, (int)hFile);

WriteFile(hFile, "father", 6, &nWritten, NULL);

// создаем дочериний процесс

ZeroMemory(&startupInfo, sizeof(startupInfo));

startupInfo.cb = sizeof(startupInfo);

if(!CreateProcess(NULL, buf,

NULL, NULL, TRUE,

CREATE_NEW_CONSOLE,

NULL, NULL, &startupInfo, &processInfo )) {

cout << Can't create process: %x\n" << GetLastError();

return 2;

}

CloseHandle(hFile);

return 0;

}

childproc.cpp

#include <windows.h>

#include <stdio.h>

#include <iostream>

using namespace std;

int main(int argc, char *argv[])

{

HANDLE hFile;

DWORD nWritten;

cout << "in child process get";

hFile = (HANDLE)atoi(argv[1]);

printf("file handle: %u\n", hFile);

WriteFile(hFile, "from child", 10, &nWritten, NULL);

system("Pause");

CloseHandle(hFile);

return 0;

}

Вывести на консоль приоритеты процесса и приоритеты потоков этого процесса. Использование динамического задания приоритетов.

#define _WIN32_WINNT 0x0400

#include <stdio.h>

#include <windows.h>

#include <string.h>

#define _SECOND 10000000

long count[10];

// Функция потока

DWORD WINAPI Thread_fun( LPVOID param );

int main(int argc, char* argv[]){

// Массив приоритетов от наименшего до наивысшего

int priority[7] = {THREAD_PRIORITY_IDLE, THREAD_PRIORITY_LOWEST, THREAD_PRIORITY_BELOW_NORMAL, THREAD_PRIORITY_NORMAL,

THREAD_PRIORITY_ABOVE_NORMAL, THREAD_PRIORITY_HIGHEST, THREAD_PRIORITY_TIME_CRITICAL};

DWORD Thread;

HANDLE hThread = GetCurrentThread();

DWORD procid = GetCurrentProcessId();

HANDLE Thread_hndl[255];

int endTime;

LARGE_INTEGER quitTime;

SYSTEMTIME now;

HANDLE wTimer;

HANDLE proc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_SET_INFORMATION, false, procid);

SetPriorityClass(proc, HIGH_PRIORITY_CLASS);

SetThreadPriority(hThread, THREAD_PRIORITY_TIME_CRITICAL);

SetThreadPriorityBoost(hThread, false);

int i;

int id[7] = {0, 1, 2, 3, 4, 5, 6};

for(i = 0; i < 7; i++){

count[i] = 0;

Thread_hndl[i] = CreateThread(NULL, 0, Thread_fun, &id[i], NULL, &Thread);

SuspendThread(Thread_hndl[i]);

SetThreadPriority(Thread_hndl[i], priority[i]);

printf("thread %d priority: %d\n", i, GetThreadPriority(Thread_hndl[i]));

SetThreadPriorityBoost(Thread_hndl[i], false);

}

for(i = 0; i < 7; i++){

ResumeThread(Thread_hndl[i]);

Sleep(2);

}

Sleep(4000);

for(i = 0; i < 7; i++){

TerminateThread(Thread_hndl[i], 0);

CloseHandle(Thread_hndl[i]);

}

for(i = 0; i < 7; i++){

printf("thread %d terminated\ncounter = %d\n", i, count[i]);

}

system("Pause");

return 0;

}

DWORD WINAPI Thread_fun( LPVOID param ){

int id = *(int*)param;

printf("id = %d\n", id);

while(1){

count[id]++;

Sleep(0);

}

return 0;

}

В программе создаются 7 потоков с различными приоритетами(от меньшего к большему).У каждого из потоков свой счетчик, непрерывно инкрементирующийся с небольшой задержкой, соответственно сравниваются потоки по тому, кто из них больше насчитает за отведенное время. В программе используется функция SetThreadPriorityBoost(); которая задает для каждого из потоков динамический или статический уровень приоритета.

Когда каждый из потоков имеет статический приоритет, задаваемый при создании, то наиболее приоритетные потоки выполняться большее количество раз, а следовательно, насчитают большее значение.

Во втором примере, включено динамическое задание приоритетов у потоков, в результате чего, каждый из потоков совершился примерно одинаковое количество раз и насчитал примерно одинаковые цифры:

Санкт-Петербург

2012

Соседние файлы в папке docx54