Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Bulgarian
  4. QVector / QList проблем при използването им със потребителски класове
Forum Updated to NodeBB v4.3 + New Features

QVector / QList проблем при използването им със потребителски класове

Scheduled Pinned Locked Moved Solved Bulgarian
qtimerconnectqtserviceqcoreapplicatio
27 Posts 2 Posters 16.5k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • S Stoyan

    @pecuna91
    Даваше грешка, само когато се компилира в Debug режим. В Release работи. Предполагам, защото във файла на проекта си задал винаги да се зарежда библиотеката QtSolutions_Service-head.dll, която е за Release. При компилиране за Debug трябва да се зарежда библиотеката QtSolutions_Service-headd.dll.

    Доколкото виждам зареждането на тригерите става с функциите loadOperationTrigger() и loadTaskTrigger(), а добавянето в съответната задача или операция - с BaseObject::actionTriggers(QString Action, const Trigger &obj).
    Ако се използва списък с указатели, аз предлагам последната функция да стане:
    int BaseObject::actionTriggers(QString Action, Trigger *obj)
    а още по-добре е да я разделиш на две функции:
    {
    addTrigger(Trigger * trigger);
    delTrigger(Trigger * trigger);
    В тях се включва:
    triggers.append(trigger); // в addTrigger() - добавя указания тригер в списъка на текущия обект (Task или Operation)
    triggers.removeAll(trigger); // в delTrigger() - премахва указания тригер от списъка на обекта.
    После ги извикваш така:
    Trigger * trigger;
    trigger = new Trigger();
    trigger->id = ...;
    trigger->type = ...;
    ...
    task.addTrigger(trigger); // или operation.addTrigger(trigger);

    P Offline
    P Offline
    pecuna91
    wrote on last edited by pecuna91
    #21

    @Stoyan
    По този начин сетвам тригерите да.
    Функцията искам да е една, еднотипна за всичките обекти.
    Проблемът сега се явява отново Segmentation fault при извикване на get някой атрибут на тригер извън globalvars класа. Например в servicе или Scheduler. Понеже понякога /в редки случаи/ не го дава предполагам че е отново реда на създаване на обектите и сетването им. Можеби ще трябва да въведа някакви паузи докато се инициализират нещата,
    Интересното е че не излизат атрибутите на тригерите когато ги викам с гетерите в друг клас извън GlobalVars и гърми с грешката.

    When everything goes wrong, remember that it could be still worse...

    S 1 Reply Last reply
    0
    • P pecuna91

      @Stoyan
      По този начин сетвам тригерите да.
      Функцията искам да е една, еднотипна за всичките обекти.
      Проблемът сега се явява отново Segmentation fault при извикване на get някой атрибут на тригер извън globalvars класа. Например в servicе или Scheduler. Понеже понякога /в редки случаи/ не го дава предполагам че е отново реда на създаване на обектите и сетването им. Можеби ще трябва да въведа някакви паузи докато се инициализират нещата,
      Интересното е че не излизат атрибутите на тригерите когато ги викам с гетерите в друг клас извън GlobalVars и гърми с грешката.

      S Offline
      S Offline
      Stoyan
      wrote on last edited by Stoyan
      #22

      BaseObject::actionTriggers в момента изпълнява две съвсем различни неща и ще бъде по-ясно ако ги разделиш в отделни функции, но естествено не е задължително. А функциите, които предложих addTrigger() и delTrigger() пак са в основния клас и са едни и същи и за задачите и за операциите.

      А за грешките - ще трябва да качиш промените, за да видя какви са и как се получават.

      P 1 Reply Last reply
      0
      • S Stoyan

        BaseObject::actionTriggers в момента изпълнява две съвсем различни неща и ще бъде по-ясно ако ги разделиш в отделни функции, но естествено не е задължително. А функциите, които предложих addTrigger() и delTrigger() пак са в основния клас и са едни и същи и за задачите и за операциите.

        А за грешките - ще трябва да качиш промените, за да видя какви са и как се получават.

        P Offline
        P Offline
        pecuna91
        wrote on last edited by pecuna91
        #23

        @Stoyan

        Качих промените. Намалил съм дебъг логването.
        Както ще видиш проблемът се появява когато се вика triggers.at(n).getНещоси от Scheduler класа 10 секунди след като се е стартирало приложението.

        When everything goes wrong, remember that it could be still worse...

        S 1 Reply Last reply
        0
        • P pecuna91

          @Stoyan

          Качих промените. Намалил съм дебъг логването.
          Както ще видиш проблемът се появява когато се вика triggers.at(n).getНещоси от Scheduler класа 10 секунди след като се е стартирало приложението.

          S Offline
          S Offline
          Stoyan
          wrote on last edited by Stoyan
          #24

          @pecuna91
          Трябва да махнеш от BaseObject::actionTriggers

          newtrigger->deleteLater();

          С него първо добавяш тригера към вектора и веднага след това го изтриваш.
          Ето какво се получи без него:

          Service started!
          SSL is supported
          Server Listening on port: 1234
          "stopped"
          Task is disabled
          activating task: "Task 2"
          Trigger: "time"
          "stopped"
          Task is disabled
          activating task: "Task 2"
          Trigger: "time"
          ....

          Освен това, защо ти е това Trigger::operator =()? Не можеш ли командите в него да ги изпълниш директно във функцията Trigger::setAll()?
          При начина, по който ги използваш в момента, всичките "operator =()" са излишни. И за Trigger, и за Task, и за Operation.

          P 1 Reply Last reply
          0
          • S Stoyan

            @pecuna91
            Трябва да махнеш от BaseObject::actionTriggers

            newtrigger->deleteLater();

            С него първо добавяш тригера към вектора и веднага след това го изтриваш.
            Ето какво се получи без него:

            Service started!
            SSL is supported
            Server Listening on port: 1234
            "stopped"
            Task is disabled
            activating task: "Task 2"
            Trigger: "time"
            "stopped"
            Task is disabled
            activating task: "Task 2"
            Trigger: "time"
            ....

            Освен това, защо ти е това Trigger::operator =()? Не можеш ли командите в него да ги изпълниш директно във функцията Trigger::setAll()?
            При начина, по който ги използваш в момента, всичките "operator =()" са излишни. И за Trigger, и за Task, и за Operation.

            P Offline
            P Offline
            pecuna91
            wrote on last edited by pecuna91
            #25

            @Stoyan
            Хмм, хем ми направи впечетление за тоя Delete later още на сокетите че го казаха в туториала че прави проблем и го сложих...
            Махнах оператор= за тригера, но ми направи впечетление че Copy constructor-а трябва да си стои като дефиниция поне иначе гърми с грешки, но защо изобщо трябва да е дефиниран , но не и реално имплентиран?

            When everything goes wrong, remember that it could be still worse...

            S 1 Reply Last reply
            0
            • P pecuna91

              @Stoyan
              Хмм, хем ми направи впечетление за тоя Delete later още на сокетите че го казаха в туториала че прави проблем и го сложих...
              Махнах оператор= за тригера, но ми направи впечетление че Copy constructor-а трябва да си стои като дефиниция поне иначе гърми с грешки, но защо изобщо трябва да е дефиниран , но не и реално имплентиран?

              S Offline
              S Offline
              Stoyan
              wrote on last edited by
              #26

              @pecuna91
              Не бих казал, че deleteLater() прави проблеми. Понякога дори не може без него. Просто в този случай не прави това, което си си мислел, че прави.

              Trigger *newtrigger = new Trigger(); // създава се нов обект Trigger като newtrigger е указател към него
              newtrigger->setAll(obj); // задават се всички параметри за тригера
              newtrigger->deleteLater(); // изтрива се обекта, към който сочи указателя
              triggers.push_back(newtrigger); // добавя се указателя към тригера във вектора

              Когато по-късно използваш triggers.at(i) всъщност взимаш указателя от вектора, но той вече сочи към случаен адрес в паметта. Затова и гърми.
              Но когато изтриваш тригер от вектора ще трябва да използваш delete() или deleteLater().

              Copy constructor-а за Trigger всъщност се използва неявно във функцията GlobalVars::loadTrigger(). Затова и не можеш да го махнеш.

              P 1 Reply Last reply
              1
              • S Stoyan

                @pecuna91
                Не бих казал, че deleteLater() прави проблеми. Понякога дори не може без него. Просто в този случай не прави това, което си си мислел, че прави.

                Trigger *newtrigger = new Trigger(); // създава се нов обект Trigger като newtrigger е указател към него
                newtrigger->setAll(obj); // задават се всички параметри за тригера
                newtrigger->deleteLater(); // изтрива се обекта, към който сочи указателя
                triggers.push_back(newtrigger); // добавя се указателя към тригера във вектора

                Когато по-късно използваш triggers.at(i) всъщност взимаш указателя от вектора, но той вече сочи към случаен адрес в паметта. Затова и гърми.
                Но когато изтриваш тригер от вектора ще трябва да използваш delete() или deleteLater().

                Copy constructor-а за Trigger всъщност се използва неявно във функцията GlobalVars::loadTrigger(). Затова и не можеш да го махнеш.

                P Offline
                P Offline
                pecuna91
                wrote on last edited by pecuna91
                #27

                @Stoyan
                error: passing 'const Operation' as 'this' argument of 'int Operation::setAttribute(QString, QString)' discards qualifiers [-fpermissive]
                operations.at(i).setAttribute(Aname,Value);

                Не мога да разбера защо се получава това съобщение в Task класа, опитвайки се да извикам метода SetAttribute за операция във вектора.
                Const Operation не знам откъде идва вътре в тази функция конкретно, след като подавам само id-то на операцията.
                Подобна е грешката и при Task сетване на атрибут:
                scheduledtopservice\scheduler.cpp:31: error: passing 'const Task' as 'this' argument of 'int Task::setAttribute(QString, QString)' discards qualifiers [-fpermissive]
                tasks.at(k).setAttribute("state","running");

                ПП:
                Успях да го реша проблема. Разбрах че .at() връща const обект, затова използвах [i] за индекс.

                task.cpp:17: warning: base class 'class BaseObject' should be explicitly initialized in the copy constructor [-Wextra]
                Task::Task(const Task &obj)
                Това как мога да го оправя, четох че създавало още 1 копие на BaseObject така. Но не е като експлицитния конструктор сякаш : BaseObject ( const BaseObject &obj) ако долепя до Copy конструктора на Task. Не съм сигурен, но май просто като сложих : BaseObject() и се изчисти предупреждението. Така ли трябвa да бъде ?

                When everything goes wrong, remember that it could be still worse...

                1 Reply Last reply
                0

                • Login

                • Login or register to search.
                • First post
                  Last post
                0
                • Categories
                • Recent
                • Tags
                • Popular
                • Users
                • Groups
                • Search
                • Get Qt Extensions
                • Unsolved