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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
nickrb
1 / 1 / 0
Регистрация: 28.11.2010
Сообщений: 37
#1

много3адачность - C++

25.03.2011, 23:09. Просмотров 597. Ответов 6

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//кусок из главной программы 
if (CreateProcess(_T("sqr.exe"),NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi1)==0) 
        cout << "general.exe: CreateProcess ошибка.\n";
    else cout << "general.exe: Создан новый процесс для sqr.exe.\n";
if (CreateProcess(_T("sum.exe"),NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi2)==0)
        cout << "general.exe: CreateProcess ошибка.\n";
else cout << "general.exe: Создан новый процесс для sum.exe.\n";
//....
//начало sqr
if ((e1=OpenEvent(EVENT_ALL_ACCESS, TRUE, _T("e1")))==0) 
        cout << "sqr.exe:     OpenEvent(e1) ошибка.\n";
    else cout << "sqr.exe:     Событие e1 открыто.\n";
    if ((f1=OpenEvent(EVENT_ALL_ACCESS, TRUE, _T("f1")))==0)
        cout << "sqr.exe:     OpenEvent(f1) ошибка.\n";
    else cout << "sqr.exe:     Событие f1 открыто.\n";
    while(1){   
    cout << "sqr.exe:     Ожидание сигнала от general.exe.\n";
//итд
то есть на экран должно вывести:
general.exe: Создан новый процесс для sqr.exe.
sqr.exe: Событие e1 открыто.
sqr.exe: Событие f1 открыто.
sqr.exe: Ожидание сигнала от general.exe.
general.exe: Создан новый процесс для sum.exe.

а получаю по несколько знаков из каждой строчки, типа: gensr .exСобныет ef1откр1
итд
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
bigredcat
365 / 312 / 3
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
25.03.2011, 23:21 #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
CRITICAL_SECTION g_cs;
 
void Print(char* buf)
{
    EnterCriticalSection(&g_cs); 
    std::cout << buf << std::endl;
    LeaveCriticalSection(&g_cs);
}
 
DWORD WINAPI MyThread(LPVOID pParam)
{
    // char buf[..]
    ....
    Print(buf);
    return 0;
}
 
int main(int argc, char *argv[])
{
    InitializeCriticalSection(&g_cs);
    ....
    DeleteCriticalSection(&g_cs);
    return 0;
}
nickrb
1 / 1 / 0
Регистрация: 28.11.2010
Сообщений: 37
25.03.2011, 23:36  [ТС] #3
получается мне каждый cout надо в таком виде оформлять
C++
1
2
3
EnterCriticalSection(&g_cs); 
std::cout << buf << std::endl;
LeaveCriticalSection(&g_cs);
у меня их порядка 100 штук
неужели нельзя сделать, чтобы процессы даже если они работают одновременно выводили свои строки последовательно
то есть если допустим поставить Sleep() в таких местах
C++
1
2
3
4
5
6
7
if (CreateProcess(_T("sqr.exe"),NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi1)==0) 
                cout << "general.exe: CreateProcess ошибка.\n";
        else cout << "general.exe: Создан новый процесс для sqr.exe.\n";
Sleep(50); //даю время чтобы sqr.exe вывел свои строки
if (CreateProcess(_T("sum.exe"),NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi2)==0)
                cout << "general.exe: CreateProcess ошибка.\n";
else cout << "general.exe: Создан новый процесс для sum.exe.\n";
все работает, но Sleep нельзя использовать, типа от этого постановка задачи меняется
и критические секции вообще вроде только для работы с потоками одного процесса, хотя я с ними не знаком
bigredcat
365 / 312 / 3
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
25.03.2011, 23:40 #4
Тебе не нужно каждый cout так оформлять. Используй везде в потоках, которые могут одновременно выполнять вывод на консоль, вместо cout функцию Print, а саму функцию так
C++
1
2
3
4
5
6
void Print(char* buf)
{
    EnterCriticalSection(&g_cs); 
    std::cout << buf << std::endl;
    LeaveCriticalSection(&g_cs);
}
А Sleep не вариант. Что будем расчитывать по времени, когда какой поток решит, что-нибудь на консоль вывести?

Да, вместо char* используй std::string, если нужно
nickrb
1 / 1 / 0
Регистрация: 28.11.2010
Сообщений: 37
25.03.2011, 23:50  [ТС] #5
да я уже сам вкурил, что сразу не допер что тут функция Print
вопрос то остается: критические секции синхронизируют только разные потоки одного процесса
у меня процессов много или я чего не понимаю, щас попробую
bigredcat
365 / 312 / 3
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
26.03.2011, 00:25 #6
Если все процессы сами выводят на одну консоль, тогда юзай мьютексы. Но по коду вроде один процесс этим занимается.
Nadya_
Сообщений: n/a
01.05.2012, 20:29 #7
nickrb, можете полностью программу выложить?
Yandex
Объявления
01.05.2012, 20:29
Ответ Создать тему
Опции темы

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