Создать процесс запускающий блокнот
#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