БГ
Dec. 10, 2018, 1:01 a.m.

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

Добрый день!

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

  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
The question is asked by the articleQt/C++ - Lesson 048. QThread — How to work with threads using moveToThread

Do you like it? Share on social networks!

11
Александр Панюшкин
  • Dec. 10, 2018, 1:29 a.m.

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

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

      Александр Панюшкин
      • Dec. 10, 2018, 1:40 a.m.
      • (edited)

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

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

      1. QList<QThread*> threadList;

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

      1. threadList.append(mythread);

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

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

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

        Александр Панюшкин
        • Dec. 10, 2018, 1:42 a.m.
        • (edited)

        Поправил.

          БГ
          • Dec. 12, 2018, 10:32 p.m.

          Допустим в

          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
                  • Dec. 14, 2018, 2:27 p.m.
                  • The answer was marked as a solution.

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

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

                    Александр Панюшкин
                    • Dec. 14, 2018, 2:44 p.m.
                    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.

                        Comments

                        Only authorized users can post comments.
                        Please, Log in or Sign up
                        • Last comments
                        • IscanderChe
                          April 12, 2025, 5:12 p.m.
                          Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
                        • AK
                          April 1, 2025, 11:41 a.m.
                          Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
                        • Evgenii Legotckoi
                          March 9, 2025, 9:02 p.m.
                          К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
                        • VP
                          March 9, 2025, 4:14 p.m.
                          Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
                        • ИМ
                          Nov. 22, 2024, 9:51 p.m.
                          Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…