Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <QCoreApplication>
- #include <QSharedMemory>
- #include <iostream>
- #include <QThread>
- using namespace std;
- //объявление переменной памяти
- QSharedMemory SM("ss");
- //переменная, отвечающая за нахождение "каретки" в памяти
- int T;
- //первый поток
- class flowOne : public QThread
- {
- public:
- void run()
- {
- //указатель на выделенную память
- char *memory1 = (char*)SM.data();
- //открытие доступа к памяти
- SM.lock();
- //выделенный массив с первой частью фразы
- QByteArray mass1 = "To be or not to be, ";
- //запись в массив
- for (int i = 0; i < mass1.size(); ++i)
- memory1[i] = mass1[i];
- //каретка перемещена на конец текста
- T=mass1.size()-1;
- //закрытие доступа к памяти
- SM.unlock();
- //прерывание выполнение первого потока
- usleep(1000000);
- //открытие доступа к памяти
- SM.lock();
- //второй массив, в который выведен весь текст, записынный в памяти
- QByteArray mass2;
- //запись в mass2 всего текста из памяти
- for (int i = 0; memory1[i]; ++i)
- mass2.append(memory1[i]);
- //закрытие доступа к памяти
- SM.unlock();
- //вывод взятого из памяти текста
- for(int i = 0; i < mass2.size(); ++i)
- cout << mass2.at(i);
- }
- };
- //второй поток
- class flowTwo : public QThread
- {
- public:
- void run()
- {
- //указатель на память
- char *memory2 = (char*)SM.data();
- //открытие доступа к памяти
- SM.lock();
- //массив, в который будет записан текст, находящийся в памяти (для проверки)
- QByteArray mass1;
- //запись текста из памяти в mass1
- for (int i = 0; memory2[i]; ++i)
- mass1.append(memory2[i]);
- //закрытие доступа к памяти
- SM.unlock();
- //вывод текста, взятого из памяти
- for(int i = 0; i < mass1.size(); ++i)
- cout << mass1.at(i);
- cout << endl;
- //открытие доступа к памяти
- SM.lock();
- //создание массива, в который будет записана вторая часть текста
- QByteArray mass2 = " that is the question\0";
- //cout << endl << "T=" << T << endl;
- //запись второй части текста в память
- for (int i = T; i < mass2.size()+T; ++i)
- memory2[i] = mass2[i-T];
- //"каретка" перемещена на конец текста
- T=mass2.size()+T-1;
- //закрытие доступа к памяти
- SM.unlock();
- }
- };
- int main()
- {
- //выделение общей памяти
- SM.create(1024);
- //"каретка" устанавливается на начало памяти
- T=0;
- //объявление потоков
- flowOne fOne;
- flowTwo fTwo;
- //запуск потоков
- fOne.start();
- fTwo.start();
- //прерывание выполнения второго потока
- fTwo.usleep(5000000);
- SM.detach();
- return 0;
- }
- /*Смысл работы программы: имеется разделяемая память SM. В первом потоке в неё записывается текст:
- * "To be or not to be, ".
- * на этом первый поток прерывается и запускается второй поток.
- * Во втором потоке в разделяемую память дописывается вторая часть текста:
- * "that is the question".
- * После чего из первого потока запускается считываение текста из всей выделенной разделяемой памяти:
- * "To be or not to be, that is the question".*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement