Форум программистов, компьютерный форум CyberForum.ru

Помогите создать программу с событием на с++ - C++

Восстановить пароль Регистрация
 
Kurvochka
0 / 0 / 0
Регистрация: 10.03.2011
Сообщений: 16
11.12.2011, 11:52     Помогите создать программу с событием на с++ #1
Доброе утро всем! Мне всегда помогали на этом форуме и хотела еще раз обратиться к Вам! Вот задали опять задание новое. Если кто-то знает эту может поможет чем сможет! Всем буду очень благодарна!!
Вот задание:
1. Реализовать с помощью механизма событий задачу, состоящую из трех потоков Р1, Р2 и Р3. Поток Р1 информирует потоки Р2 и Р3 о событии А, состоявшейся в потоке Р1 (рис. а).
2. Реализовать с помощью механизма событий задачу, состоящую из трех потоков Р1, Р2 и Р3. Поток Р1 информирует поток Р2 о событии А, состоявшейся в потоке Р1. После этого поток Р2 информирует поток Р3 о событии В, состоявшейся в потоке Р2 (рис.б).
3. Реализовать с помощью механизма событий задачу, состоящую из трех потоков Р1, Р2 и Р3. Поток Р1 ожидает наступления событий А и В в потоках Р2 и Р3, соответственно (рис.в).

Заранее Всем спасибо за помощь и за внимание!!
Миниатюры
Помогите создать программу с событием на с++  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kurvochka
0 / 0 / 0
Регистрация: 10.03.2011
Сообщений: 16
11.12.2011, 11:55  [ТС]     Помогите создать программу с событием на с++ #2
Вот рисунок побольше, а то первый очень маленький вышел.
Миниатюры
Помогите создать программу с событием на с++  
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
11.12.2011, 15:48     Помогите создать программу с событием на с++ #3
Цитата Сообщение от Kurvochka Посмотреть сообщение
1. Реализовать с помощью механизма событий задачу, состоящую из трех потоков Р1, Р2 и Р3. Поток Р1 информирует потоки Р2 и Р3 о событии А, состоявшейся в потоке Р1 (рис. а).
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
77
78
79
80
81
82
83
84
85
#include <windows.h>
#include <stdio.h>
#define MAX_THREADS  3
#define XCLOSE_HANDLE(obj, cnt)  {  for(DWORD i = 0u; i < cnt; i++) { CloseHandle(obj[i]); } }
void  setEvent(void);
DWORD WINAPI  ThreadP1(LPVOID);
DWORD WINAPI  ThreadP2(LPVOID);
DWORD WINAPI  ThreadP3(LPVOID);
 
HANDLE threads[MAX_THREADS];
HANDLE events[MAX_THREADS - 1];
BOOL   loop = TRUE;
 
int main(void) {
  events[0] = CreateEvent(NULL, TRUE, FALSE, NULL);
  events[1] = CreateEvent(NULL, TRUE, FALSE, NULL);
  if(! events[0] || ! events[1])
        return 1;
 
  threads[0] = CreateThread(NULL, 0u, ThreadP1, NULL, 0u, NULL);
  threads[1] = CreateThread(NULL, 0u, ThreadP2, NULL, 0u, NULL);
  threads[2] = CreateThread(NULL, 0u, ThreadP3, NULL, 0u, NULL);
 
  WaitForMultipleObjects(MAX_THREADS, threads, TRUE, INFINITE);
 
  XCLOSE_HANDLE(threads, MAX_THREADS);
  XCLOSE_HANDLE(events, MAX_THREADS - 1);
  printf("End threads...\n");
  getchar();
  return 0;
}
 
 
void  setEvent(void) {
   for(DWORD i = 0u; i < MAX_THREADS - 1; i++)
        SetEvent(events[i]);
}
 
// главный поток по генерации события
DWORD WINAPI  ThreadP1(LPVOID p) {
    DWORD cur = 0u, sec = GetTickCount();
    while(1) {
        cur = GetTickCount();
        if((cur - sec) > 2000u) {  // событие генерируется через каждые 2 секунды
              setEvent();
              sec = cur;
        }
        if(GetAsyncKeyState(VK_ESCAPE)) {  // для выхода клав-esc
              loop ^= loop;
              setEvent();
              return 0u;
        }
    }
    return (0u);
}
 
// поток P2 для результата события выводит в заголовок-калькулятора
DWORD WINAPI  ThreadP2(LPVOID p) {
  WinExec("calc.exe", SW_SHOW);
  HWND  wnd = ::GetForegroundWindow();
  int   cnt = 0;
  CHAR  buf[32] = {'\0'};
  while(wnd != NULL && loop) {
         if(WaitForSingleObject(events[0], INFINITE) == WAIT_OBJECT_0) {
                wsprintfA(buf, "WORK THREAD P2 - %d", ++cnt);
                SetWindowTextA(wnd, buf);
                ResetEvent(events[0]);
          }
  }
  if(wnd)
      PostMessage(wnd, WM_QUIT, 0, 0);
  return (0u);
}
 
// поток P3 для результата события выводит в консоль
DWORD WINAPI  ThreadP3(LPVOID p) {
  int  cnt = 0;
  while(loop) {
        if(WaitForSingleObject(events[1], INFINITE) == WAIT_OBJECT_0) {
            printf("WORK THREAD P3 - %d\n", ++cnt);
            ResetEvent(events[1]);
        }
  }
  return (0u);
}
Kurvochka
0 / 0 / 0
Регистрация: 10.03.2011
Сообщений: 16
14.12.2011, 17:18  [ТС]     Помогите создать программу с событием на с++ #4
Спасибо за первый случай! а остальные 2 никто не знает?

2. Реализовать с помощью механизма событий задачу, состоящую из трех потоков Р1, Р2 и Р3. Поток Р1 информирует поток Р2 о событии А, состоявшейся в потоке Р1. После этого поток Р2 информирует поток Р3 о событии В, состоявшейся в потоке Р2 (рис.б).

3. Реализовать с помощью механизма событий задачу, состоящую из трех потоков Р1, Р2 и Р3. Поток Р1 ожидает наступления событий А и В в потоках Р2 и Р3, соответственно (рис.в).
lavan
51 / 51 / 1
Регистрация: 21.03.2009
Сообщений: 371
14.12.2011, 19:01     Помогите создать программу с событием на с++ #5
как то делал задачу, в принципе вам подходит.Вот задание
Написать программу, создающую три потока. Каждый поток выполняет какие-то
вычисления. При чём второму потоку на каком-то этапе вычисления необходимы
результаты работы первого потока, а третьему результаты работы второго
потока. Создавать потоки необходимо в таком порядке: третий, второй,
первый
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
77
#include<windows.h>
#include<iostream>
using namespace std;
void thr1(void *);
void thr2(void *);
HANDLE ev1,ev2;
int main() {
    HANDLE ht[2];
    DWORD dwInit[2];
    int ar[3][4];
    for(int i=0;i<3;i++)
    for(int j=0;j<3;j++) {
        ar[i][j]=1+rand()%50;
    }
    for(int i=0;i<3;i++) {
        for(int j=0;j<3;j++){
        cout.width(4);
        cout<<ar[i][j]<<" ";
        }
        cout<<endl;
    }
    ht[0]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)thr1,(void *)ar,0,&dwInit[0]);
    ht[1]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)thr2,(void *)ar,0,
    &dwInit[0]);
    ev1=CreateEvent(NULL,FALSE,FALSE,NULL);
    ev2=CreateEvent(NULL,FALSE,FALSE,NULL);
    int sum=0;
    for(int i=0;i<4;i++) {
        if(i==3) {
            WaitForSingleObject(ev2,INFINITE);
            sum+=ar[1][i];
            ar[2][i]=sum;
        }
        sum+=ar[2][i];
    }
    cout<<"after\n\n";
    for(int i=0;i<3;i++) {
        for(int j=0;j<4;j++) {
        cout.width(4);
        cout<<ar[i][j]<<" ";
        }
        cout<<endl;
    }
    CloseHandle(ht[0]);
    CloseHandle(ht[1]);
    CloseHandle(ev1);
    CloseHandle(ev2);
    cin.get();
    return 0;
}
void thr1(void *tptr) {
    int *ptr=(int *)tptr;
    int sum=0;
    for(int i=0;i<4;i++) {
        if(i==3) {
           ptr[0*4+i]=sum;
            break;
        }
        sum+=ptr[0*4+i];
    }
    cout<<endl;
    SetEvent(ev1);
}
void thr2(void *tptr) {
    int *ptr=(int*)tptr;
    int sum=0;
    for(int i=0;i<4;i++) {
        if(i==3) {
        WaitForSingleObject(ev1,INFINITE);
           sum+=ptr[0*4+i];
            ptr[1*4+i]=sum;
            break;
        }
        sum+=ptr[1*4+i];
    }
    SetEvent(ev2);
}
Yandex
Объявления
14.12.2011, 19:01     Помогите создать программу с событием на с++
Ответ Создать тему
Опции темы

Текущее время: 05:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru