Russian Qt Forum
Ноябрь 24, 2024, 15:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [qt-4.2.0] Приостановить конструктор до прихода сигнала  (Прочитано 5349 раз)
izoomer
Гость
« : Май 11, 2007, 20:01 »

В конструкторе главного окна есть код
Код:

deviceDispatcher = new JDeviceDispatcher(this);

player = new JPlayer(this, deviceDispatcher);
cashRegister = new JCashRegister (this,deviceDispatcher);
configModel = new JConfigModel(deviceDispatcher);


так вот ... в deviceDispatcher идет формирование данных, без которых не должны создаваться следующие объекты ... то есть для объекта player нужен сформировавшийся deviceDispatcher , а получается так, что код выполняется дальше , а данные в deviceDispatcher не получены есче все ,... как сделать так , что бы в конструкторе главного окна дождаться выполнения всех операций в deviceDispatcher , а потом продолжать код ?
Может показывать окно какое то с сообщением что "данные формируются, ждите " .... как так сделать ?
Записан
AlexVR
Гость
« Ответ #1 : Май 11, 2007, 20:59 »

Цитата: "izoomer"
В конструкторе главного окна есть код
Код:

deviceDispatcher = new JDeviceDispatcher(this);

player = new JPlayer(this, deviceDispatcher);
cashRegister = new JCashRegister (this,deviceDispatcher);
configModel = new JConfigModel(deviceDispatcher);


так вот ... в deviceDispatcher идет формирование данных, без которых не должны создаваться следующие объекты ... то есть для объекта player нужен сформировавшийся deviceDispatcher , а получается так, что код выполняется дальше , а данные в deviceDispatcher не получены есче все ,... как сделать так , что бы в конструкторе главного окна дождаться выполнения всех операций в deviceDispatcher , а потом продолжать код ?
Может показывать окно какое то с сообщением что "данные формируются, ждите " .... как так сделать ?
Это, что у тебя конструктор JDeviceDispatcher создает отдельный поток для свой инициализации? Или как это он еще не сформировал все данные?
Записан
izoomer
Гость
« Ответ #2 : Май 11, 2007, 21:06 »

Цитата: "AlexVR"
Цитата: "izoomer"
В конструкторе главного окна есть код
Код:

deviceDispatcher = new JDeviceDispatcher(this);

player = new JPlayer(this, deviceDispatcher);
cashRegister = new JCashRegister (this,deviceDispatcher);
configModel = new JConfigModel(deviceDispatcher);


так вот ... в deviceDispatcher идет формирование данных, без которых не должны создаваться следующие объекты ... то есть для объекта player нужен сформировавшийся deviceDispatcher , а получается так, что код выполняется дальше , а данные в deviceDispatcher не получены есче все ,... как сделать так , что бы в конструкторе главного окна дождаться выполнения всех операций в deviceDispatcher , а потом продолжать код ?
Может показывать окно какое то с сообщением что "данные формируются, ждите " .... как так сделать ?
Это, что у тебя конструктор JDeviceDispatcher создает отдельный поток для свой инициализации? Или как это он еще не сформировал все данные?

в нем есть есче один класс, который читает данные из последовательного порта. Этот класс создается и читает данные в слоте своем , по сигнгалу от QSocketNotifer.
Записан
AlexVR
Гость
« Ответ #3 : Май 11, 2007, 21:58 »

Заводи public флаг в классе JDeviceDispatcher. И жди его установки. Только тогда код:

  deviceDispatcher = new JDeviceDispatcher(this);
  // ...
  // Ожидание флага
  // ...
  player = new JPlayer(this, deviceDispatcher);
  cashRegister = new JCashRegister (this,deviceDispatcher);
  configModel = new JConfigModel(deviceDispatcher);

заноси в отдельный поток, чтобы не подвисало.

----

Можно, конечно попробывать создать сигнал в JDeviceDispatcher и связать его со слотом главной формы, в котором и провести оставшиеся инициализации.
Но тут нет уверености, что за время после создания класса и коннекта сигнала и слота, уже не будет вызван этот сигнал.
Записан
izoomer
Гость
« Ответ #4 : Май 11, 2007, 23:23 »

в моем случае можно подвисать .... тогда в блоке ожидания флага делаем цикл while(1){} ... а вот как прально сделать класс deviceDispatcher .... сделать его QThread ?

добавлено спустя 13 минут:

 сделал
Код:

class JDeviceDispatcher : public QThread
{
Q_OBJECT
public:
JDeviceDispatcher(QObject *_parent = 0);
~JDeviceDispatcher();
void run();
              bool flagReady;
              bool isReady() { return flagReady; }
...
...
..

run пустое у меня.
сделал переменную flagReady .... в конструкторе делаю её false .... затем когда все готово делаю её true .... так вот ... в основном конструторе главного окна ...
Код:

deviceDispatcher = new JDeviceDispatcher(this);
deviceDispatcher->start();

  while(1){
  if ( deviceDispatcher->isReady() == true) break;
    }

player = new JPlayer(this, deviceDispatcher);
cashRegister = new JCashRegister (this,deviceDispatcher);


и висит на wile ... класс deviceDispatcher не хочет выполняться ... вообще стоит ... я же делаю ему start() , я так понимаю что он должен на фоне запустится и работать пока тут while гоняется .... что не так делаю ?
Записан
AlexVR
Гость
« Ответ #5 : Май 12, 2007, 00:13 »

Как говорилось, при таком методе нужен втрой поток.
А можно обойтись и только слотами и сигналами.

В JDeviceDispatcher
1. Создаем public slot для запуска инициализации (например, StartInit())
2. Создаём сигнал о завершении инициализации, через который сообщаям об её успешности (например, StopedInit(bool b))
3. По окончании инициализации вызываем StopedInit.

В Главном окне
1. Создаем слот для продолжения инициализации окна (например, ContinueInit(bool b)). Если все хорошо, то в нем вызываем
Код:

   player = new JPlayer(this, deviceDispatcher);
   cashRegister = new JCashRegister (this,deviceDispatcher);
   configModel = new JConfigModel(deviceDispatcher);
   Раздизабливаем окно

2. В конструкторе:
Код:

  Создаем JDeviceDispatcher
  Конектим ContinueInit и StopedInit
  Вызываем StartInit
  Дизаблим окно
Записан
izoomer
Гость
« Ответ #6 : Май 12, 2007, 09:38 »

Цитата: "AlexVR"
Как говорилось, при таком методе нужен втрой поток.
А можно обойтись и только слотами и сигналами.

В JDeviceDispatcher
1. Создаем public slot для запуска инициализации (например, StartInit())
2. Создаём сигнал о завершении инициализации, через который сообщаям об её успешности (например, StopedInit(bool b))
3. По окончании инициализации вызываем StopedInit.

В Главном окне
1. Создаем слот для продолжения инициализации окна (например, ContinueInit(bool b)). Если все хорошо, то в нем вызываем
Код:

   player = new JPlayer(this, deviceDispatcher);
   cashRegister = new JCashRegister (this,deviceDispatcher);
   configModel = new JConfigModel(deviceDispatcher);
   Раздизабливаем окно

2. В конструкторе:
Код:

  Создаем JDeviceDispatcher
  Конектим ContinueInit и StopedInit
  Вызываем StartInit
  Дизаблим окно


 та хотел именно с потоками сделатиь .... конструктор большой, и много всяких инициализаций придется выносить ... много переделывать ... да есче и хотел окно ожидания каконить показывать .... вот и хотел на потоках сделать ... может подскажет кто, как прально сделать мою задачу на потоках ?
Записан
goer
Гость
« Ответ #7 : Май 12, 2007, 12:18 »

Я вобщем особо предыдущие посты не читал, но сразу пришла мысль сделать паузу через QEventLoop: и проц грузить не будет как while(1) и юзать удобно так как средство кутевое.

Вместо сигнала тогда можно послать событие, суть та же.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 21.