Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.76/55: Рейтинг темы: голосов - 55, средняя оценка - 4.76
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
1

Управление процессами и потоками

15.06.2011, 11:00. Показов 10645. Ответов 6
Метки нет (Все метки)

Необходимо разработать программу, демонстрирующую возможности управления процессами и потоками: создание и завершение, получение сведений о выполняемых задачах. Синхронизация потоков с использованием критических секций и с использованием объектов ядра (функции ожидания, ожидаемые таймеры, очередь асинхронных вызовов процедур). Подобрать примеры, которые наглядно демонстрируют различные функции созданного приложения.

Может у кого-нибудь пример данной проги имеется? Если нет то объясните, WinApi для меня как минимум непонятен с его многоообразием типов данных и функций...
Посоветуйте хороший справочник Win32API где на русском всё подробно разъясняется, значение каждой функции и параметров подставляемых в неё. (На примере справки AutoIt!)
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.06.2011, 11:00
Ответы с готовыми решениями:

Работа с процессами и потоками в Windows
Создать приложение, запускающее пять дочерних потоков. Каждый поток выполняет вывод сообщения об...

Обмен сообщениями между процессами (не потоками одного процесса!!!)
В общем есть несколько процессов (отдельных экзешников). Им необходимо вместе работать. Причем у...

Управление процессами
Добрый день всем. Осталась сдать последнюю работу по процессам. Скажу честно, по процессам я не...

Построение экранного интерфейса. Управление процессами
Создать главное окно с областью заголовка, рамкой , элементами управления (кнопки свертования -...

6
933 / 758 / 299
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
26.06.2011, 03:02 2
Смотри привёл тебе два примера с объектом ядра семафор и критической секции, первый пример на основе процессов первый процесс будет записывать в файл данные другие будут ждать пока данные не будут записаны в файл, после того как будут записаны данные в файл ждущие процессы откроют и отобразят данные в консоль.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <stdio.h>
#include <Windows.h>
#define   PROCCESS_MAX    3   // 0-3(4) тестируем 4 - процесса синхронизации, если число превысит
                                           // то превысящий процесс не получит отклика и будет висеть
 
 
void  main(void){
 
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    // спасибо Дейкстре за созданый семафор
    HANDLE  semaphore  = NULL; 
    semaphore              = CreateSemaphore(NULL, 0, PROCCESS_MAX,  "xAtom");  // создаём семафор
 
     // если семафор уже был создан значит процесс уж запущен нужно синхронизоваться
    if(semaphore == INVALID_HANDLE_VALUE  ||  GetLastError() == ERROR_ALREADY_EXISTS)  {
        
         semaphore = OpenSemaphore(SYNCHRONIZE, TRUE,  "xAtom"); // открываем семафор
         if(semaphore == NULL) {
            puts("Не получилось открыть семафор !!!");
        exit(1);
          }
 
          puts("Здесь ждём пока работающий процесс не подаст нам сигнал !");
            
          while(WaitForSingleObject(semaphore, INFINITE) != WAIT_OBJECT_0) ;  // ждём пока
                
 
                // открываем файл читаем
         HANDLE  fp = CreateFile("X:\\share.txt", GENERIC_READ, FILE_SHARE_READ, 
                                         NULL,  OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    
       TCHAR  buffer[4096];
       ZeroMemory(buffer, sizeof(buffer));
       DWORD  r;
       ReadFile(fp, (LPVOID)buffer, sizeof(buffer), &r, NULL);
       CloseHandle(fp);
 
       puts(buffer);
 
       puts("Операция завершена !!!");
             
   }  else {  // только одному процессу в очереди посчастливиться этот кусок кода
 
    SleepEx(500, TRUE);   
 
     HANDLE  fp = CreateFile("X:\\share.txt", GENERIC_WRITE, FILE_SHARE_WRITE, 
                                         NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
 
               // записываем 30-строк в файл
      for(int   cnt = 0; cnt < 30; cnt++ ) {
        TCHAR  buffer[255];
        SYSTEMTIME  tm;
        GetLocalTime(&tm);
        wsprintf(buffer, "%d:%d  xAtom, xAtom, xAtom, xAtom, xAtom, xAtom\n", 
                                            tm.wMonth, tm.wSecond);
        DWORD  w;
        WriteFile(fp, (LPCVOID)buffer, lstrlen(buffer), &w, NULL);  
        printf("Запись номер  = %d\n", cnt + 1);
 
        SleepEx(1000, TRUE);
    }
    FlushFileBuffers(fp);
    CloseHandle(fp);
 
    SleepEx(1000, TRUE);
    puts("Операция завершена !!!");
    }
 
    LONG   p = 0L;
    ReleaseSemaphore(semaphore, PROCCESS_MAX, &p);  // освободим семафор декрементируя его
    CloseHandle(semaphore);
 
    getchar();
}
Второй пример на основе многопаточности в одном процессе как мы знаем всегда создаётся в процессе один поток еденица программного исполняющего кода также можно создать дополнительные еденицы паралельного исполнения кода(на одном процессоре можно сказать псевдо-параллельность) и если ядром ОС разработана специально для многопроцессорных исполнений, физическая параллельность исполнения только на многопроцессорной платформе. Всегда встаёт вопрос как синхронизировать потоки или процессы когда они обращаются к одному общему ресурсу например к Базе данных, или к списку активынх процессов - PCBs, для этого были созданы различные объекты синхронизаций: семафоры, критические секции, таймеры ожиданий, мьютексы, события, асинхронные вызовы и т.п. Вот последний тебе пример критическая секция.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <stdio.h>
#include <Windows.h>
 
 
// массив будет общим ресурсом среди двух потоков
DWORD   arr[10]  = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
 
 
CRITICAL_SECTION   section;
 
 
// поток
DWORD  __stdcall  _thread(LPVOID  param) {
 
    EnterCriticalSection(&section);  // захватить массив в свою обработку
    for(int  cycle = 0; cycle < 1000; cycle++) {
        for(int i = 0; i < sizeof(arr) / sizeof(DWORD); i++) 
            arr[i]++;
            Sleep(2u);
    }
    puts("thread - 2, finally work !!!");
    LeaveCriticalSection(&section);
    return (0);
}
 
 
 
void  main(void){
 
     InitializeCriticalSection(&section); // инициализировать критическую секцию
 
 
    DWORD    id = 0;
    HANDLE   thread = CreateThread(NULL, 0U, _thread, NULL, THREAD_PRIORITY_NORMAL, &id);
    
    Sleep(100u);
 
           // думаешь кто первый будет обрабатывать массив основной поток программы или 
          // или второй созданый   
 
    EnterCriticalSection(&section);  // берём в своё пользование массив
    for(int i = 0; i < sizeof(arr) / sizeof(DWORD); i++) 
          arr[i] *= -10;
    LeaveCriticalSection(&section);
    puts("thread - 1: the end...");
 
     
     CloseHandle(thread);
     DeleteCriticalSection(&section);   // удаляем критическую секцию
 
 
     for(int  p = 0; p < sizeof(arr) / sizeof(DWORD); p++)
        printf("%d, ", arr[p]);
 
 
     getchar();
}
Для полного тебе разжёвывания здесь много можно привести примеров, ищи книги про программирование многопоточных приложений, мнопроцессорные системы и их синхронизации.
1
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
17.10.2012, 20:53  [ТС] 3
Извини за беспокойство, но в первом твоём примере я не понял как создаются именно 4 процесса?

Добавлено через 1 час 20 минут
всё, разобрался...
0
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 6
28.10.2012, 14:27 4
Извини за беспокойство, в первом твоем примере очень сложный код. я не поняла как создаются процессы, и как они выполняются?
0
29 / 28 / 7
Регистрация: 10.07.2009
Сообщений: 317
28.10.2012, 14:54  [ТС] 5
Цитата Сообщение от Nazek Посмотреть сообщение
Извини за беспокойство, в первом твоем примере очень сложный код. я не поняла как создаются процессы, и как они выполняются?
Это просто пример, на самом деле никаких дочерних процессов не создаётся, создаётся лишь семафор, который контролирует объект "xAtom" (такой объект мы не создавали), количество контролируемых ресурсов изначально установили в 0, поэтому семафор занят, а следовательно ждём...

Для понимания работы процессов и потоков почитай Щупака, Харта и Рихтера.

Добавлено через 6 минут
Вот их соответствующие книги:
[Щупак][2007] Win32 API
Харт - Системное программирование в среде Windows
Рихтер - Windows для профессионалов, создание эффективных win32 приложений
1
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 6
28.10.2012, 15:38 6
спасибо
0
0 / 0 / 0
Регистрация: 28.10.2012
Сообщений: 6
31.10.2012, 17:59 7
Цитата Сообщение от >arty< Посмотреть сообщение
Это просто пример, на самом деле никаких дочерних процессов не создаётся, создаётся лишь семафор, который контролирует объект "xAtom" (такой объект мы не создавали), количество контролируемых ресурсов изначально установили в 0, поэтому семафор занят, а следовательно ждём...

Для понимания работы процессов и потоков почитай Щупака, Харта и Рихтера.

Добавлено через 6 минут
Вот их соответствующие книги:
[Щупак][2007] Win32 API
Харт - Системное программирование в среде Windows
Рихтер - Windows для профессионалов, создание эффективных win32 приложений
у тебя случайно нету примеров демонстрирующие работу процессов используя семафоры?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.10.2012, 17:59

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Удаленное управление потоками
Здравствуйте. Задача следующая: Необходимо удаленно подключиться к компьютеру в домене, найти все...

Управление процессами и потоками
Найти сумму (n и 1), (n-1 и 2) и т.д. элементов массива. Обработка каждой суммы в порожденном...

Работа с процессами и потоками
Здравствуйте! Нужна ваша помощь! Если кто знает как делать эти задания, буду очень благодарен. ...

Работа с потоками и процессами windows
Почему выбивает ошибку в строке PInf *Inf ? Нашёл пример в методичке..помогите разобраться ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.