БГ
10 декабря 2018 г. 1:01

Потоки и обращение к ним

Добрый день!

Я создаю потоки так

  1. for(int i=1;i<=5;i++){
  2. MyObject *myobject = new MyObject;
  3. QThread *mythread = new QThread;
  4. myobject ->moveToThread(mythread);
  5. QObject::connect(mythread, &QThread ::started, myobject , &MyObject ::process);
  6. mythread ->start();
  7. }

Подразумевается, что потоки не завершаются сами, а по сигналу.
Как я могу обратится к определенному потоку, чтобы послать ему сигнал завершения?

4
Вопрос задан по статьеQt/C++ - Урок 048. QThread - работа с потоками с помощью moveToThread

Вам это нравится? Поделитесь в социальных сетях!

11
Александр Панюшкин
  • 10 декабря 2018 г. 1:29

Сохранить ссылки на потоки в массиве или векторе. Такой вариант не подходит?

    Есть возможность привести пример в массиве или в векторе?

      Александр Панюшкин
      • 10 декабря 2018 г. 1:40
      • (ред.)

      Пишу с телефона, могу опечататься.

      Перед циклом инициируем переменную. Например, так:

      1. QList<QThread*> threadList;

      Затем в цикле добавляем поток в массив:

      1. threadList.append(mythread);

      Обращение, соответственно, затем либо через цикл, либо напрямую:

      1. QThread *thread = threadList.at(n);

      Где n - номер потока.

        Александр Панюшкин
        • 10 декабря 2018 г. 1:42
        • (ред.)

        Поправил.

          БГ
          • 12 декабря 2018 г. 22:32

          Допустим в

          1. MyObject *myobject = new MyObject;

          есть метод

          1. start(){
          2. while(aaa){
          3. ////////////////
          4. }
          5. }

          Как мне обратиться к методу

          1. stop(){
          2. aaa=false;
          3. }

          ?
          Соответственно потоков столько, сколько их в

          1. QList<QThread*> threadList;

            Как мне из главного потока обратиться к методу объекта, который я поместил в отдельный поток?

              Evgenii Legotckoi
              • 14 декабря 2018 г. 3:17

              Да точно также, как и к обычному объекту. Просто в том методе лучше мьютексами обезопаситься, ну а по всем потокам можно пройтись в цикле.

                БГ
                • 14 декабря 2018 г. 12:32

                Если есть возможность, приведите пожалуйста пример. Соответственно потоки у меня создаются в цикле и мне необходимо обратиться к методу объекта помещенного в поток. Пример кода выше

                  Evgenii Legotckoi
                  • 14 декабря 2018 г. 14:27
                  • Ответ был помечен как решение.

                  Вечером или чуть позже.

                  А в свою очередь кроме списка потоков, создайте ещё и список указателей на объекты. Тогда вы сможете без проблем и не трогая сами потоки, вызывать методы объектов в потоках.

                    Александр Панюшкин
                    • 14 декабря 2018 г. 14:44
                    1. QVector<MyObject*> objectsVector;
                    2. QVector<QThread*> threadsVector;
                    3.  
                    4. for(int i=1;i<=5;i++){
                    5. MyObject *myobject = new MyObject;
                    6. QThread *mythread = new QThread;
                    7. objectsVector.append(myobject);
                    8. threadsVector.append(threadsVector);
                    9. myobject ->moveToThread(mythread);
                    10. QObject::connect(mythread, &QThread ::started,
                    11. myobject , &MyObject ::process);
                    12. mythread ->start();
                    13. }
                    14.  
                    15. // Обращение напрямую по номеру потока (так себе вариант - можно ошибиться с
                    16. // номером и вылезти за пределы массива, лучше делать через отдельную функцию
                    17. // и проверять номер потока на валидность)
                    18. int n = 2; // Задали номер потока - обращаю внимание, в вас в цикле отсчет идет
                    19. // с единицы, а в массивах с нуля!
                    20. objectsVector.at(n)->start(); //вызов функции старт
                    21. objectsVector.at(n)->stop(); // вызов функции стоп
                    22.  
                    23. // Тоже самое, но в цикле:
                    24. for (int i = 0; i < objectsVector.count(); i++) {
                    25. objectsVector.at(i)->start();
                    26. objectsVector.at(i)->stop();
                    27. }

                      Большое всем спасибо за помощь! Использую вариант с QList.

                        Комментарии

                        Только авторизованные пользователи могут публиковать комментарии.
                        Пожалуйста, авторизуйтесь или зарегистрируйтесь