Advertisement
Guest User

Untitled

a guest
Dec 21st, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <QCoreApplication>
  2. #include <QSharedMemory>
  3. #include <iostream>
  4. #include <QThread>
  5.  
  6. using namespace std;
  7.  
  8. //объявление переменной памяти
  9. QSharedMemory SM("ss");
  10. //переменная, отвечающая за нахождение "каретки" в памяти
  11. int T;
  12.  
  13. //первый поток
  14. class flowOne : public QThread
  15. {
  16. public:
  17.     void run()
  18.     {
  19.         //указатель на выделенную память
  20.         char *memory1 = (char*)SM.data();
  21.  
  22.         //открытие доступа к памяти
  23.         SM.lock();
  24.         //выделенный массив с первой частью фразы
  25.         QByteArray mass1 = "To be or not to be, ";
  26.         //запись в массив
  27.         for (int i = 0; i < mass1.size(); ++i)
  28.             memory1[i] = mass1[i];
  29.         //каретка перемещена на конец текста
  30.         T=mass1.size()-1;
  31.         //закрытие доступа к памяти
  32.         SM.unlock();
  33.  
  34.         //прерывание выполнение первого потока
  35.         usleep(1000000);
  36.  
  37.         //открытие доступа к памяти
  38.         SM.lock();
  39.         //второй массив, в который выведен весь текст, записынный в памяти
  40.         QByteArray mass2;
  41.         //запись в mass2 всего текста из памяти
  42.         for (int i = 0; memory1[i]; ++i)
  43.             mass2.append(memory1[i]);
  44.         //закрытие доступа к памяти
  45.         SM.unlock();
  46.  
  47.         //вывод взятого из памяти текста
  48.         for(int i = 0; i < mass2.size(); ++i)
  49.             cout << mass2.at(i);
  50.  
  51.  
  52.  
  53.     }
  54. };
  55.  
  56. //второй поток
  57. class flowTwo : public QThread
  58. {
  59. public:
  60.     void run()
  61.     {
  62.         //указатель на память
  63.         char *memory2 = (char*)SM.data();
  64.  
  65.         //открытие доступа к памяти
  66.         SM.lock();
  67.         //массив, в который будет записан текст, находящийся в памяти (для проверки)
  68.         QByteArray mass1;
  69.         //запись текста из памяти в mass1
  70.         for (int i = 0; memory2[i]; ++i)
  71.             mass1.append(memory2[i]);
  72.         //закрытие доступа к памяти
  73.         SM.unlock();
  74.  
  75.         //вывод текста, взятого из памяти
  76.         for(int i = 0; i < mass1.size(); ++i)
  77.             cout << mass1.at(i);
  78.         cout << endl;
  79.  
  80.  
  81.         //открытие доступа к памяти
  82.         SM.lock();
  83.         //создание массива, в который будет записана вторая часть текста
  84.         QByteArray mass2 = " that is the question\0";
  85.         //cout << endl << "T=" << T << endl;
  86.  
  87.         //запись второй части текста в память
  88.         for (int i = T; i < mass2.size()+T; ++i)
  89.             memory2[i] = mass2[i-T];
  90.  
  91.         //"каретка" перемещена на конец текста
  92.         T=mass2.size()+T-1;
  93.         //закрытие доступа к памяти
  94.         SM.unlock();
  95.  
  96.     }
  97. };
  98.  
  99. int main()
  100. {
  101.     //выделение общей памяти
  102.     SM.create(1024);
  103.     //"каретка" устанавливается на начало памяти
  104.     T=0;
  105.  
  106.     //объявление потоков
  107.     flowOne fOne;
  108.     flowTwo fTwo;
  109.  
  110.     //запуск потоков
  111.     fOne.start();
  112.     fTwo.start();
  113.     //прерывание выполнения второго потока
  114.     fTwo.usleep(5000000);
  115.  
  116.     SM.detach();
  117.  
  118.     return 0;
  119. }
  120.  
  121. /*Смысл работы программы: имеется разделяемая память SM. В первом потоке в неё записывается текст:
  122.  * "To be or not to be, ".
  123.  * на этом первый поток прерывается и запускается второй поток.
  124.  * Во втором потоке в разделяемую память дописывается вторая часть текста:
  125.  * "that is the question".
  126.  * После чего из первого потока запускается считываение текста из всей выделенной разделяемой памяти:
  127.  * "To be or not to be, that is the question".*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement