3 / 3 / 2
Регистрация: 13.11.2010
Сообщений: 57
1

Синхронизация процесов

15.04.2013, 20:54. Показов 1488. Ответов 7
Метки нет (Все метки)

Привет всем ... Помогите пожалуйста, я в QT недавно .... немного непривычно после С ...
Думал сделать проект на Линукс, в котором есть 3 отдельных исполняемых файла: disp, in_buf, out_buf

Смысл такой: disp создает семафор (нужно именно семафор) и запускает 2 процеса - in_buf i out_buf. 1-й пишет в файл числа, второй подсчитывает их суму и записивает ее в другой файл ... Пробовал сделать с помощью QSystemSemaphore так, чтоб процес out_buf ждал, пока in_buf запишет все числа ... Но не получаеться ... Пробовал даже просто запустить in_buf, чтоб посмотреть правильно ли создал и использую семафор, но там тоже есть проблемы ..Предоставляю код .. Зарание благодарен

Файл disp:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <QtCore/QCoreApplication>
#include <QSystemSemaphore>
#include <QProcess>
#include <iostream>
#include <unistd.h>
using namespace std;
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QSystemSemaphore ("SEM",1,QSystemSemaphore::Create);
    QProcess *A = new QProcess();
    QProcess *B = new QProcess();
    A->execute("/home/vadim/in_buf");
    B->execute("/home/vadim/out_buf");
    return a.exec();
}
Файл in_buf:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <QtCore/QCoreApplication>
#include <QSystemSemaphore>
#include <iostream>
#include <fstream>
#include <unistd.h>
using namespace std;
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QSystemSemaphore *sem = new QSystemSemaphore ("SEM");
    cout << sem->acquire()<<endl;
    ofstream f_in("/home/vadim/1.txt");
    cout<<"Process 1"<<endl;
    for (int i=0;i<5;i++) f_in<<i<<endl, sleep(1);
    f_in.close();*/
    cout<<sem->release(1)<<endl;
    return 0;
}
Файл out_buf:

C++ (Qt)
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
#include <QtCore/QCoreApplication>
#include <QSystemSemaphore>
#include <iostream>
#include <fstream>
#include <unistd.h>
using namespace std;
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
   QSystemSemaphore *sem = new QSystemSemaphore ("SEM");
    int b,s=0;
    cout << "Process 2"<<endl;
    sem->acquire();
    ifstream f_out("/home/vadim/1.txt");
    while (!f_out.eof())
    {
        f_out>>b;
        s+=b;
    }
    f_out.close();
    ofstream f_in("/home/vadim/2.txt");
    f_in<<s;
    f_in.close();
    sem->release(1);
    return 0;
}
0

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

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.04.2013, 20:54
Ответы с готовыми решениями:

Синхронизация данных
Здравствуйте,кто-нибудь может помочь с синхронизацией,подробно ее описать и показать на...

Вертикальная синхронизация
Собсна сделал я на qt движек для анимации, и запустив простейший пример, увидел что изображение...

синхронизация потоков
Доброе утро, нужен ваш совет. Ситуация такая: ПОТОК 1 (высылает сигналы с сообщениями с...

Синхронизация потоков
Доброго времени суток. У меня вопрос по QMutex. Но для начала, вот что я набросал: #ifndef...

7
Эксперт С++
8379 / 6115 / 613
Регистрация: 10.12.2010
Сообщений: 28,533
Записей в блоге: 30
15.04.2013, 20:58 2
Предположу что QSystemSemaphore для межпотокового взаимодействия, а не для взаимодействия процессов.
0
3 / 3 / 2
Регистрация: 13.11.2010
Сообщений: 57
15.04.2013, 21:04  [ТС] 3
а такой вопрос .... если я запускаю execute два файла, то у меня создаються два потока или два процеса ?
0
Эксперт С++
8379 / 6115 / 613
Регистрация: 10.12.2010
Сообщений: 28,533
Записей в блоге: 30
15.04.2013, 21:07 4
Ну QProcess говорит сам за себя ...

Добавлено через 2 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
Предположу что QSystemSemaphore для межпотокового взаимодействия, а не для взаимодействия процессов.
Like its lighter counterpart QSemaphore, a QSystemSemaphore can be accessed from multiple threads. Unlike QSemaphore, a QSystemSemaphore can also be accessed from multiple processes. This means QSystemSemaphore is a much heavier class, so if your application doesn't need to access your semaphores across multiple processes, you will probably want to use QSemaphore.
http://harmattan-dev.nokia.com... ml#details

Не все правильно для процессов ....
0
3 / 3 / 2
Регистрация: 13.11.2010
Сообщений: 57
15.04.2013, 21:11  [ТС] 5
ну если я понял, то для отдельных процесов ... значит он мне и нужен ... но не получаеться реализовать этот код ... если запустить 1-й процес (in_buf) то значение acquire = 1 ... если я правильно понял документацию, то это значит, то не удалось захватить семафор ... в чем тогда проблема ?
0
266 / 188 / 33
Регистрация: 15.01.2011
Сообщений: 681
15.04.2013, 21:37 6
Лучший ответ Сообщение было отмечено как решение

Решение

http://habrahabr.ru/post/141266/ интересная статья про синхронизацию : " Введение в программирование без блокировок с С++ и Qt перевод "
2
3 / 3 / 2
Регистрация: 13.11.2010
Сообщений: 57
15.04.2013, 21:42  [ТС] 7
спасибо конечно, я перечитал, но мне такая не подойдет ... вообще надо сделать несколько процесов, половина с которых пишет даные в буфер, остальные читают их .... надо именно с помощью семафоров сделать так, чтоб те, что читают, не читали, пока пишеться в буфер, и наоборот - те, что пишут не писали, пока буфер читаеться .... но это потом ... для начала хотел разобраться с простым примером ... два процеса одновременно - один пишет в файл, другой читает ... нужно, чтоб тот, что читает подождал, пока первый не запишет все в файл ... такое ожидание, такую синхронизацию сделать семафором ... сверху есть наброски кода .. но они работают проблематично ...
0
Эксперт С++
8379 / 6115 / 613
Регистрация: 10.12.2010
Сообщений: 28,533
Записей в блоге: 30
15.04.2013, 23:34 8
Цитата Сообщение от Sarmat Посмотреть сообщение
ну если я понял, то для отдельных процесов ... значит он мне и нужен ... но не получаеться реализовать этот код ... если запустить 1-й процес (in_buf) то значение acquire = 1 ... если я правильно понял документацию, то это значит, то не удалось захватить семафор ... в чем тогда проблема ?
Наверное по тому что он уже занят другим процессом, который его опередил.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.04.2013, 23:34

Синхронизация не потоков
делаю аутентификацию ВК. из конструктора вызываю функцию, которая подгружает в браузере формочку,...

Синхронизация потоков
Механизм потоков в Qt не совсем понимаю, наверное от сюда такие вопросы Не просите, пжлт,...

диспетчер процесов
у меня не открывается диспетчер задач не какой реакции при нажатии ctrl+alt+delete а запускаю ...

Програмирование физически процесов
Задача о теле брошенном под углом к горизонту дан угол альфа начальная скорость и сопротивление...


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

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

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